WebSocket на нескольких репликах: сообщение доходит не всем
Чат на WebSocket работал на одном инстансе. После переезда в Kubernetes и масштабирования до трёх реплик пользователи получают лишь часть сообщений: видят их только те, кто оказался подключён к той же реплике, что и отправитель. Список подключённых сокетов и комнаты хранятся в памяти процесса.
Что здесь корень проблемы и что делать?
- Достаточно включить sticky sessions на балансировщике: каждый пользователь закрепится за одной репликой, и сообщения дойдут до всех участников комнаты
- У каждой реплики своё состояние в памяти, поэтому события не выходят за её пределы; нужен общий канал между репликами — адаптер поверх Redis pub/sub или брокера
- WebSocket не работает за балансировщиком, для многоинстансных систем нужно перейти на long polling
- Проблема в отсутствии общей базы: если писать сообщения в PostgreSQL, клиенты будут получать их через подписку на таблицу
