Выбор ответа Senior Кластер, воркеры, масштабирование обновлено
WebSocket на нескольких экземплярах
Вопрос
Чат на WebSocket запущен в 3 экземплярах. Алиса подключена к первому, Боб ко второму. Как доставить сообщение Алисы Бобу?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Общая шина: Redis pub/sub, все экземпляры подписаны. Каждое WebSocket-соединение живёт в конкретном процессе.
Варианты ответа
- Балансировщик сам переправит сообщение нужному экземпляру
- Включить sticky sessions, этого достаточно для доставки
- Общая шина: Redis pub/sub, все экземпляры подписаныправильный ответ
- Хранить все соединения в базе данных и читать оттуда
Разбор
Каждое WebSocket-соединение живёт в конкретном процессе. Чтобы сообщение дошло до клиента на другом экземпляре, экземпляры обмениваются событиями через общую шину. Так работает, например, Redis-адаптер Socket.IO.
- Балансировщик пересылает байты соединения, а не маршрутизирует сообщения между пользователями.
- Sticky sessions закрепляют клиента за экземпляром, но Алиса и Боб всё равно на разных.
- Сокет нельзя сохранить в базе, это объект в памяти процесса.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Кластер, воркеры, масштабирование»
- Консистентное хеширование с виртуальными узлами
- Балансировка least connections
- Плавный взвешенный round-robin как в nginx
- Код-ревью: сервис перед масштабированием в 4 инстанса
- Модуль cluster
- cluster внутри Kubernetes
- Память у воркеров cluster
- cluster или worker_threads