Работая в качестве веб-фрилансера, меня интересует, как работают разные фреймворки и технологии, но большинство тестов, найденных в Интернете, рассматривают только пример Hello World.

Когда вы создаете реальное приложение, необходимо учитывать и другие аспекты, поэтому я решил провести полный тест между наиболее популярными фреймворками и технологиями.

Наряду с производительностью меня интересовало, насколько легко решать конкретные задачи в каждой структуре и какова стоимость масштабирования производительности приложения.

Кто кандидаты

  • Laravel 5, PHP 7.0, Nginx
  • Люмен 5, PHP 7.0, Nginx
  • Экспресс JS 4, Node.js 8.1, PM2
  • Джанго, Python 2.7, Gunicorn
  • Весна 4, Java, Tomcat
  • .NET Core, пустельга

Что мы тестируем

Нас интересует количество запросов в секунду, которые каждая платформа выполняет на разных конфигурациях сервера, а также то, насколько чистым или подробным выглядит код.

Как выглядят конфигурации серверов

Нас также интересует, как каждый фреймворк масштабирует свою производительность и какова цена достижения такой производительности. Поэтому мы протестируем их на 3-х различных конфигурациях серверов с помощью DigitalOcean:

  • 1 процессор, 512 МБ - 5 долларов в месяц
  • 4 CPU, 8 ГБ - 80 долларов в месяц
  • 12 CPU, 32 ГБ - 320 долларов в месяц

Что мы строим

Мы хотим протестировать пример реального приложения, поэтому мы в основном создадим Web REST API, который предоставляет 4 конечные точки, каждая из которых имеет разную сложность:

  1. Hello World - просто ответьте JSON, содержащим строку Hello World.
  2. Вычисление - вычисление первых 10.000 чисел Фибоначчи.
  3. Простой список - у нас есть база данных MySQL, содержащая таблицу стран, и мы перечислим все страны.
  4. Сложный список - мы добавляем таблицу users вместе с сопоставлением "многие ко многим" между пользователями и странами, и мы хотим перечислить всех пользователей, которые посетили Франция, как и все страны, которые посетил каждый.

Для создания двух последних конечных точек мы будем использовать инструменты, которые предоставляет каждая платформа, чтобы достичь нашей цели самым простым способом.

Как мы их тестируем

Для их тестирования мы будем использовать инструменты тестирования HTTP wrk и ab, чтобы проверить, получаем ли мы аналогичные результаты, а также варьировать параллелизм запросов, чтобы каждая технология могла раскрыть свой максимальный потенциал.

Эти инструменты будут работать на собственном капле, созданном в DigitalOcean, поэтому они не будут конкурировать за ресурсы сервера с фактическим приложением API.

Кроме того, сервер, используемый для размещения тестовых запросов, и сервер, используемый для запуска приложения, связаны с использованием их частного IP-адреса, поэтому заметных сетевых задержек не будет.

Результаты тестов

Ниже вы можете увидеть результаты, сгруппированные по каждой конечной точке, а также вы можете проверить на одной диаграмме, как каждая платформа масштабируется на разных конфигурациях сервера.

Как построен API

Ниже приведены фактические контроллеры, используемые для каждой платформы, чтобы составить представление о том, как выглядит код. Вы также можете проверить весь код, доступный на Github.

Laravel и Lumen с PHP

Экспресс JS с Node.js

Django с Python

Весна с Java

.NET Core

Выводы

Имея в виду, что в реальном приложении почти все запросы взаимодействуют с базой данных, ни один из вариантов не является плохим, и все они могут удовлетворить требования большинства веб-приложений.

Однако производительность Node.js с Express JS весьма примечательна. Он конкурирует с такими технологиями, как Java и .NET Core, или даже превосходит их, а в сочетании с простотой Javascript ES6, который вы можете изначально использовать с Node.js 8, он обеспечивает такую ​​большую мощность.

Что касается масштабируемости приложений, лучшая производительность по затратам была получена на сервере среднего размера. Добавление 12 ядер и 32 ГБ памяти не помогло. Возможно, в этом случае узкое место где-то еще или требует тонкой настройки, чтобы полностью раскрыть потенциал сервера.

Что вы думаете?

Если вы нашли результаты интересными, нажмите кнопку 💚️, чтобы другие тоже могли их увидеть. Вы можете найти весь исходный код здесь:

Https://github.com/mihaicracan/web-rest-api-benchmark