Веб-сокеты при балансировке нагрузки
Я знаю, что вокруг этой темы было много дискуссий, но я не смог найти именно то, что искал. Вот проблема:
Предположим, что:
- У нас есть веб-приложение, которое устанавливает соединение через веб-сокет с веб-службой, которая находится за балансировщиком нагрузки (HAProxy), и у нас есть 2 таких веб-службы.
- Каждый веб-сервис может инициировать некоторые события, такие как сохранение в базе данных, и мы хотим уведомить наших клиентов (веб-приложение) об этом событии через веб-сокеты.
Вот проблема: подключение к веб-сокету может быть установлено с 1 веб-сервисом, а событие может происходить на другом. Поэтому в этом случае мы не сможем уведомить клиента.
Несколько идей, как бы я решил эту проблему:
- Заставьте балансировщик нагрузки установить соединение веб-сокета со всеми серверами прозрачно для клиента. Таким образом, клиент устанавливает одно соединение, а LB создает несколько для бэкэнда. Насколько я понимаю, это невозможно с типичными балансировщиками нагрузки, такими как HAProxy
- Клиент устанавливает несколько подключений через веб-сокет, столько же, сколько имеется серверных веб-сервисов. Не лучшая практика, но может сработать. Есть ли способ передать какой-то заголовок, чтобы сообщить HAProxy установить соединение с определенным бэкэндом?
- Есть какая-то внешняя постоянная очередь и 1 рабочий, который будет обрабатывать подключения к веб-сокетам. Здесь возникает вопрос HA. Как справиться с развертыванием такого обработчика и т. Д.? Другой вариант - обрабатывать эти события во всех экземплярах веб-службы и отправлять сообщение в веб-приложение, только если в этом веб-сервисе имеется соединение через веб-сокет.
Довольно много идей, каждая довольно сомнительна. Может быть, я упускаю какое-то очевидное решение такой (предположительно) распространенной проблемы. Любые указатели высоко ценятся.
Заранее спасибо!