Веб-сокеты при балансировке нагрузки

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

Предположим, что:

  • У нас есть веб-приложение, которое устанавливает соединение через веб-сокет с веб-службой, которая находится за балансировщиком нагрузки (HAProxy), и у нас есть 2 таких веб-службы.
  • Каждый веб-сервис может инициировать некоторые события, такие как сохранение в базе данных, и мы хотим уведомить наших клиентов (веб-приложение) об этом событии через веб-сокеты.

Вот проблема: подключение к веб-сокету может быть установлено с 1 веб-сервисом, а событие может происходить на другом. Поэтому в этом случае мы не сможем уведомить клиента.

Несколько идей, как бы я решил эту проблему:

  • Заставьте балансировщик нагрузки установить соединение веб-сокета со всеми серверами прозрачно для клиента. Таким образом, клиент устанавливает одно соединение, а LB создает несколько для бэкэнда. Насколько я понимаю, это невозможно с типичными балансировщиками нагрузки, такими как HAProxy
  • Клиент устанавливает несколько подключений через веб-сокет, столько же, сколько имеется серверных веб-сервисов. Не лучшая практика, но может сработать. Есть ли способ передать какой-то заголовок, чтобы сообщить HAProxy установить соединение с определенным бэкэндом?
  • Есть какая-то внешняя постоянная очередь и 1 рабочий, который будет обрабатывать подключения к веб-сокетам. Здесь возникает вопрос HA. Как справиться с развертыванием такого обработчика и т. Д.? Другой вариант - обрабатывать эти события во всех экземплярах веб-службы и отправлять сообщение в веб-приложение, только если в этом веб-сервисе имеется соединение через веб-сокет.

Довольно много идей, каждая довольно сомнительна. Может быть, я упускаю какое-то очевидное решение такой (предположительно) распространенной проблемы. Любые указатели высоко ценятся.

Заранее спасибо!

0 ответов

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