Выбор ответа Senior Разборы систем обновлено
Доставка сообщения в чате
Вопрос
Пользователи держат WebSocket-соединения с одним из 200 gateway-серверов. Как сервису сообщений узнать, куда отправить сообщение получателю?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Хранить userid → gateway в общем хранилище (Redis с TTL). Реестр соединений позволяет отправить сообщение точно на нужный gateway (или нескольким, если устройств несколько), а TTL с heartbeat убирает устаревшие записи после обрыва.
Варианты ответа
- Рассылать каждое сообщение на все 200 gateway, а лишние отбросят
- Хранить user_id → gateway в общем хранилище (Redis с TTL)правильный ответ
- Клиент сам раз в секунду спрашивает новые сообщения по HTTP
- Привязать пользователя к gateway навсегда по хешу user_id
Разбор
Реестр соединений позволяет отправить сообщение точно на нужный gateway (или нескольким, если устройств несколько), а TTL с heartbeat убирает устаревшие записи после обрыва. Рассылка на все gateway умножает трафик в 200 раз. Опрос раз в секунду даёт задержку и огромный лишний RPS. Жёсткая привязка по хешу ломается при падении или добавлении gateway и мешает балансировке.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.