Балансировщик нагрузки Aws для событий, отправленных сервером, или веб-сокетов

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

Какие варианты у меня есть для горизонтального масштабирования долгоживущих соединений?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
0
2 819
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Поскольку вы используете AWS, я бы рекомендовал Эластичный бобовый стебель для развертывания вашего приложения Node.js. Официальная документация содержит хорошие примеры, такие как Вот этот. Обратите внимание, что Beanstalk будет автоматически создать Elastic Load Balancer для вас, что вам и нужно.

By default, Elastic Beanstalk creates an Application Load Balancer for your environment when you enable load balancing with the Elastic Beanstalk console or the EB CLI. It configures the load balancer to listen for HTTP traffic on port 80 and forward this traffic to instances on the same port.

[...]

Note: Your environment must be in a VPC with subnets in at least two Availability Zones to create an Application Load Balancer. All new AWS accounts include default VPCs that meet this requirement. If your environment is in a VPC with subnets in only one Availability Zone, it defaults to a Classic Load Balancer. If you don't have any subnets, you can't enable load balancing.

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

In a load balanced environment, Elastic Load Balancing sends a request to each instance in an environment every 10 seconds to confirm that instances are healthy. By default, the load balancer is configured to open a TCP connection on port 80. If the instance acknowledges the connection, it is considered healthy.

You can choose to override this setting by specifying an existing resource in your application. If you specify a path, such as /health, the health check URL is set to HTTP:80/health. The health check URL should be set to a path that is always served by your application. If it is set to a static page that is served or cached by the web server in front of your application, health checks will not reveal issues with the application server or web container.

Обновлено: Если вы ищете липкие сеансы, как я описал в комментариях, выполните шаги, указанные в это руководство:

To enable sticky sessions using the console

  1. Open the Amazon EC2 console at https://console.aws.amazon.com/ec2/.

  2. On the navigation pane, under LOAD BALANCING, choose Target Groups.

  3. Select the target group.

  4. On the Description tab, choose Edit attributes.

  5. On the Edit attributes page, do the following:

a. Select Enable load balancer generated cookie stickiness.

b. For Stickiness duration, specify a value between 1 second and 7 days.

c. Choose Save.

Я использую Beanstalk. Мой вопрос заключается в том, как настроить маршрутизацию к экземплярам, ​​чтобы они не перегружали один экземпляр. Соединения сохраняются и могут длиться часами. В настоящее время он использует циклический перебор для распределения новых запросов, и это не сработает.

ajaxon 22.02.2019 20:25

Вы ищете механизм «липких сессий»? В идеале для лучшей масштабируемости следует отказаться от сохранения состояния.

Fabio Manzano 22.02.2019 20:38
Ответ принят как подходящий

Похоже, вам нужен балансировщик нагрузки, который может предоставлять как «закрепленные сеансы», так и использовать «наименьшее количество подключений» вместо политики «циклического перебора». К сожалению, NGINX не может этого обеспечить.

HAProxy (High Availability Proxy) позволяет это:

backend bk_myapp
 cookie MyAPP insert indirect nocache
 balance leastconn
 server srv1 10.0.0.1:80 check cookie srv1
 server srv2 10.0.0.2:80 check cookie srv2

Если вам нужна функциональность ELB и вы хотите накатить все это вручную, взгляните на этот руководство.

Вы также можете убедиться, что классическая «закрепленная сессия» AWS ELB конфигурация или более новая опция ALB "липкая сессия" не соответствуют вашим потребностям. ELB обычно отправляет соединение на вышестоящий сервер с наименьшей «нагрузкой», и в сочетании с липкими сессиями может быть достаточно.

Да я посмотрю на это. Прилепленные сеансы работают нормально, и я использую Redis для обмена состоянием между узлами. Статья о конфигурации посвящена классическому балансировщику нагрузки, который я собирался удалить из aws.

ajaxon 23.02.2019 23:32

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

ajaxon 02.03.2019 19:30

Другие вопросы по теме