Выбор ответа Senior Кластер, воркеры, масштабирование обновлено

WebSocket на нескольких экземплярах

Вопрос

Чат на WebSocket запущен в 3 экземплярах. Алиса подключена к первому, Боб ко второму. Как доставить сообщение Алисы Бобу?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Общая шина: Redis pub/sub, все экземпляры подписаны. Каждое WebSocket-соединение живёт в конкретном процессе.

Варианты ответа

  1. Балансировщик сам переправит сообщение нужному экземпляру
  2. Включить sticky sessions, этого достаточно для доставки
  3. Общая шина: Redis pub/sub, все экземпляры подписаныправильный ответ
  4. Хранить все соединения в базе данных и читать оттуда

Разбор

Каждое WebSocket-соединение живёт в конкретном процессе. Чтобы сообщение дошло до клиента на другом экземпляре, экземпляры обмениваются событиями через общую шину. Так работает, например, Redis-адаптер Socket.IO.

  • Балансировщик пересылает байты соединения, а не маршрутизирует сообщения между пользователями.
  • Sticky sessions закрепляют клиента за экземпляром, но Алиса и Боб всё равно на разных.
  • Сокет нельзя сохранить в базе, это объект в памяти процесса.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме