BACK
Use casesWebSocket 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-протоколе.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...