Выбор ответа Senior Разборы систем обновлено

Доставка сообщения в чате

Вопрос

Пользователи держат WebSocket-соединения с одним из 200 gateway-серверов. Как сервису сообщений узнать, куда отправить сообщение получателю?

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

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

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

Коротко

Правильный ответ: Хранить userid → gateway в общем хранилище (Redis с TTL). Реестр соединений позволяет отправить сообщение точно на нужный gateway (или нескольким, если устройств несколько), а TTL с heartbeat убирает устаревшие записи после обрыва.

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

  1. Рассылать каждое сообщение на все 200 gateway, а лишние отбросят
  2. Хранить user_id → gateway в общем хранилище (Redis с TTL)правильный ответ
  3. Клиент сам раз в секунду спрашивает новые сообщения по HTTP
  4. Привязать пользователя к gateway навсегда по хешу user_id

Разбор

Реестр соединений позволяет отправить сообщение точно на нужный gateway (или нескольким, если устройств несколько), а TTL с heartbeat убирает устаревшие записи после обрыва. Рассылка на все gateway умножает трафик в 200 раз. Опрос раз в секунду даёт задержку и огромный лишний RPS. Жёсткая привязка по хешу ломается при падении или добавлении gateway и мешает балансировке.

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

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