Сравнение веб-серверов: Java медленнее, чем Node.js
Действительно? Давайте закодируем и сравним.
На прошлой неделе, посреди продолжительного отпуска, Medium.com предложил мне эту статью . Это сравнение собственного HTTP-сервера Node.js и Java.
После этого я следил за этим другим бенчмарком Java vs Node.js от того же автора, а затем за этой статьей о фиаско Java . Общий опыт чтения заставил меня почувствовать, что Java уступает Node.js. Напоминает молодого разработчика. Он молод, амбициозен и хочет превратить все, к чему прикасается, в Javascript и Typescript.
«Java работает медленно, — сказал он.
Ну, я могу поспорить об этом в разделе комментариев. Я мог бы объяснить, как приложение использует поток, и как поток Java связан с потоком ОС, и почему Springboot похож на большой грузовик, и вы тратите его возможности впустую. Я также могу предложить сравнить его с реактивным неблокирующим фреймворком Java, показать некоторые веб-сайты, которые делают бенчмарки и бла..бла..бла. В конце концов, я уверен, я никого не переубедю!
«Будет забавно, если я смогу показать, насколько они ошибаются, самостоятельно написав бенчмарк», — подумал я.
Итак, сказал я себе, держи мой Rendang , давай кодировать и выясним.
Механизм тестирования
Я следую тому, как автор в этой статье сделал тест:
- Возврат простой строки.
- Протестируйте с помощью Bombardier — это утилита Go для нагрузочного тестирования. Вы можете найти информацию здесь .
- И используйте одну и ту же машину для приложения (SUT) и инструмента нагрузочного тестирования.
Приложение будет использовать следующее аппаратное и программное обеспечение:
- Процессор Intel i7 с 4 ядрами
- Оперативная память: 16 ГБ
- Windows 11 Pro, версия 22H2.
- Ява 20
- Узел 18




Мы протестируем 2 популярных веб-сервера Node.js, 2 нереактивных веб-сервера Java и 2 реактивных веб-сервера Java. Вот они:
- Express : очень популярный веб-сервер Node.js.
- Fastify : он претендует на звание самого быстрого веб-сервера Node.js.
- Jetty : популярный нереактивный веб-сервер Java.
- Undertow : еще один традиционный нереактивный веб-сервер Java, используемый многими платформами Java, включая Springboot.
- Reactor : реактивный Java-сервер, на котором работает Spring WebFlux.
- Vert.x-Web : еще один популярный реактивный Java-сервер.
- Это не научный эталон. Меня интересует производительность — только количество запросов в секунду. Если вам нужен бенчмарк для вашего проекта, в котором используются вышеуказанные серверы, вам следует провести анализ для вашего варианта использования. Вероятно, вам нужно собрать более полную матрицу.
- Весь исходный код для этого теста можно найти в моем репозитории GitHub. Вот ссылка:https://github.com/mailindra/webserver-comparison.
- Если вы считаете, что я могу что-то сделать для повышения производительности для Java или Node.js, сообщите мне об этом в комментарии. Или, лучше, клонируйте мой репозиторий, протестируйте его самостоятельно и отправьте мне запрос на слияние.
Node.js: Экспресс
Веб-сайт Express утверждает, что это минималистичный веб-фреймворк. Как вы можете видеть ниже, код Express прост и продуман. В этом тесте сервер просто возвращает «Hello, People» для каждого запроса.

После запуска приложения мы тестируем его.
Сначала с небольшими подключениями — небольшими запросами, затем с использованием 500 подключений и 1 миллиона запросов. Для каждого теста я делал 1 раунд разминки перед тестом. Вот результат:
A. Тест с 50 подключениями и 1000 запросов:

B. Тест с 500 подключениями и 1 миллионом запросов:

Node.js: ускорить
Код Fastify похож на код Express. Веб-сайт утверждает, что Fastify очень эффективен и удобен для разработчиков. Вот код:

A. Тест на 50 подключений и 1000 запросов:

B. Тест на 500 подключений и 1 миллион запросов:

Результаты Fastify показывают, что это намного быстрее, чем Express. Заявление о веб-сайте Fastify кажется верным .

Ява: пристань
Jetty — это веб-сервер Java и контейнер сервлетов. Он нереактивный, но поддерживает асинхронность. Вот код:

A. Тест с 50 подключениями и 1000 запросов:

B. Тест с 500 подключениями и 1 миллионом запросов:

Как вы можете видеть в результате, Jetty работает достаточно хорошо. Это намного быстрее, чем node.js Fastify.
Ява: Отлив
Как и Jetty, Undertow является нереактивным веб-сервером Java. Он предназначен для встраивания. Как вы можете видеть ниже, код беглый и простой для понимания:

A. Тест с 50 подключениями и 1000 запросов:

B. Тест с 500 подключениями и 1 миллионом запросов:

Из результата видно, что Undertow намного быстрее, чем оба сервера Node.js. Это даже быстрее, чем Jetty.
Ява: Реактор
Reactor, если быть точным, Reactor-Netty, — это реактивный веб-сервер, на котором работает Spring Webflux. Как видите, код проще, чем Jetty и Undertow. Он очень похож на Node.js:

A. Тест с 50 подключениями и 1000 запросов:

B. Тест с 500 подключениями и 1 миллионом запросов:

Опять же, Java Reactor работает намного быстрее, чем оба веб-сервера Node.js.
Java: Vertx-Web
Как сказано в его документации , Vert.x-Web — это Java Swiss Army Knife для создания современных веб-приложений. Это реактивный фреймворк. Как и в случае с Reactor, код также беглый и простой для понимания.

A. Тест с 50 подключениями и 1000 запросов:

B. Тест с 500 подключениями и 1 миллионом запросов:

Как видите, Vertx работает достаточно хорошо. Лучше, чем серверы Node.js, и даже лучше, чем Java Reactor.
Результат
Чтобы у нас была хорошая визуализация, я делаю гистограмму этого теста:
- Первый тест, результат тестирования 50 одновременных подключений и 1000 запросов:


Заключение
- Нет, Java не медленнее, чем Node.js и Javascript. В самостоятельном выполнении теста хорошо то, что вы можете убедить себя. Вы не можете убедить других в том, во что не верите.
- Серверы Java Reactive и Non-Reactive работают лучше, чем серверы Node.js.
- Меня удивляет, что неблокирующие серверы Java хорошо работают при низком и высоком количестве одновременных подключений и могут конкурировать с реактивным сервером, таким как Reactor и Vert.x.
- Экспресс :https://expressjs.com/
- Укрепить :https://www.fastify.io/
- Причал :https://www.eclipse.org/jetty/
- Отлив :https://undertow.io/
- Реактор :https://projectreactor.io/
- Vert.x-Веб :https://vertx.io/docs/vertx-web/java/
- Репозиторий тестов :https://github.com/mailindra/webserver-comparison