Масштабирование WebSockets с очередью сообщений
Я построилWebSockets
сервер, который действует как маршрутизатор сообщений чата (то есть принимает сообщения от клиентов и передает их другим клиентам в соответствии с клиентомID
).
Требуется, чтобы сервис мог масштабироваться для обработки многих миллионов одновременных соединений с открытыми сокетами, и я хочу иметь возможность горизонтального масштабирования сервера.
Я имел в виду архитектуру, заключающуюся в том, чтобы узлы сервера websocket размещались за балансировщиком нагрузки, что создает проблему, поскольку клиенты, подключенные к разным узлам, не будут знать друг о друге. Хотя оба клиентаA
а такжеB
войти черезLoadBalancer
клиентA
может иметь открытое соединение с узлом1
пока клиентB
подключен к узлу2
- каждый узел содержит свой собственный словарь открытых соединений сокетов.
Чтобы решить эту проблему, я подумал об использовании такой системы MQ, какZeroMQ
или жеRabbitMQ
, Все узлы сервера websocket будут подписчиками сервера MQ, и когда узел получит запрос на маршрутизацию сообщения клиенту, которого нет в словаре локальных соединений, он будетpub
-пишите сообщение на сервер MQ, который расскажет всеsub
-scriber узлы для поиска этого клиента и выдачи сообщения, если он подключен к этому узлу.
Q1:
Имеет ли эта архитектура смысл?
Q2:
Этоpub-sub
описанный здесь шаблон действительно то, что я ищу?