Балансер — NodeJS или Nginx?

Сейчас имеем следующую структуру:
Nginx роутит определенную маску запросов в кластер ноды через один сокет, нода сама занимается балансингом.

Интересует опыт людей, которые по тем или иным причинам отказались от встроенного в кластер балансера и перенесли эту функцию на nginx. Есть ли здесь подводные камни, с какими проблемами столкнулись?

В моем случае хочется иметь больше возможностей по настройке балансировки, в частности ip_hash и least_connect. При этом отказываться от кластера (через pm2) целиком пока не собираюсь, он имеет ряд полезных плюшек, которые нецелесообразно переизобретать.

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

Естественно кластер в этом случае переводится в режим NODE_SHED_POLICY=none
  • Вопрос задан
  • 1984 просмотра
Решения вопроса 1
3y3
@3y3 Автор вопроса
Итак для истории:

Особой разницы, с точки зрения производительности, при использовании балансера Nginx против NodeJS нет.

Мы сравнивали нашу старую архитектуру построенную с использованием strong-cluster-control c балансировкой через NodeJS, и новую на основе luster с балансировкой на Nginx.
В обоих случаях был поднят кластер на cpu-1 процессов (в данном случае 32-1)
В случае luster каждый процесс слушает свой unix сокет, балансировка внутри ноды отключена. В Nginx создан апстрим на эти самые 31 сокет с балансировкой least_connect.

luster был использован как готового решение, поддерживающее сохранение индекса воркера при его перезапуске, в основных тестах другие его возможности не использовались.

В стрельбах с постоянной нагрузкой на реальном проекте были замечены незначительные отклонения потребления system и user CPU как в одну так и в другую сторону.
В стрельбах на отказ стабильность повысилась на 5-10%.

Тестируемое приложение является stateless middleware с преимущественно асинхронными операциями, период простоя в одном стеке не больше 5 мс. Приложение на данный момент не занимается рендерингом шаблонов.

Для приложений с тяжелыми синхронными операциями (с периодом простоя в стеке больше 50мс) был получен совет использовать следующую архитектуру:
Все так же поднимаем кластер на cpu-1, но настраиваем luster на меньшее количество групп, например по 4 воркера в каждой группе, т.е. 4 воркера будут слушать один сокет.
Балансировку в ноде все так же отключаем. Получаем предварительную балансировку least_connect средствами Nginx и дополнительную балансировку средствами системы, которая будет делать выбор опираясь на готовность процесса к чтению из сокета.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
akzhan
@akzhan
Посмотрите в сторону HA Proxy. Ну или nginx. Все-таки некорректно использовать сервер приложений как балансировщик.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы