У меня есть очень простое приложение nodejs, которое принимает данные json (приблизительно 1 КБ) через тело запроса POST. Ответ немедленно отправляется обратно клиенту, а json асинхронно отправляется в очередь Apache Kafka. Количество одновременных запросов может достигать 10000 в секунду, что мы моделируем с помощью Apache Jmeter, работающего на трех разных машинах. Цель состоит в том, чтобы достичь средней пропускной способности менее одной секунды без неудачных запросов.
На 4-ядерном компьютере приложение обрабатывает до 4015 запросов в секунду без каких-либо сбоев. Однако, поскольку целью является 10 000 запросов в секунду, мы развернули приложение узла в кластерной среде.
И кластеризация на одном компьютере, и кластеризация между двумя разными машинами (как описано здесь) были реализованы. Nginx использовался в качестве балансировщика нагрузки для циклического перебора входящих запросов между двумя экземплярами узла. Мы ожидали значительного улучшения пропускной способности (как задокументировано здесь) но результаты были наоборот. Количество успешных запросов упало примерно до 3100 запросов в секунду.
Мои вопросы:
- Что могло пойти не так в кластерном подходе?
- Это вообще правильный способ увеличить пропускную способность приложения Node?
- Мы также выполнили аналогичное упражнение с веб-приложением Java в контейнере Tomcat, и оно выполнило, как и ожидалось, 4000 запросов с одним экземпляром и около 5000 успешных запросов в кластере с двумя экземплярами. Это противоречит нашему убеждению, что nodejs работает лучше, чем Tomcat. Tomcat в целом лучше из-за своей модели потока для каждого запроса?
Заранее большое спасибо.