Use cases/WebSocket multiplex — каналы поверх одного сокета
Use cases · 46 辞
WebSocket multiplex — каналы поверх одного сокета
Паттерн
Один socket — много логических каналов. Сообщения tagged по topic: chat, notifications, prices. Открывать отдельный socket на каждую фичу — дорого и сложно. Решение: маршрутизация по topic поверх одного соединения.
Какую проблему решаем
Императивный switch(message.topic) в одном callback смешивает логику всех фич. Каждый компонент тащит зависимость на общий socket, и отписаться от одного канала, не задев другие, — нетривиально.
Операторы и зачем они нужны
groupBy(message => message.topic) — разбивает один поток сообщений на N отдельных streams по topic.
mergeMap(group$ => ...) — подписываемся на каждую группу.
filter + map — обрабатываем сообщения конкретного канала.
Подводные камни
groupBy при unbounded number of topics держит группы в памяти. Используйте durationSelector для cleanup редких/одноразовых topics.
Простой filter по topic работает на 2-3 канала, но не масштабируется до десятков. groupBy чище.
Не открывайте отдельный socket на каждый feature module. Это не дёшево.
Что в итоге получаем
Один socket обслуживает несколько независимых feature-потоков. Компоненты получают обычный Observable и не знают о multiplex-протоколе.