Вступить в клуб →
сложнаявопросREST API на NestJS и Express

WebSocket на нескольких репликах: сообщение доходит не всем

Чат на WebSocket работал на одном инстансе. После переезда в Kubernetes и масштабирования до трёх реплик пользователи получают лишь часть сообщений: видят их только те, кто оказался подключён к той же реплике, что и отправитель. Список подключённых сокетов и комнаты хранятся в памяти процесса.

Что здесь корень проблемы и что делать?

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

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела