Как отдавать через WebSocket потоки данных?



@mitaichik

Добрый день.
Поделитесь опытом, как решить такую задачу:

Есть сервер, там — 5 тыс потоков данных. Допустим, каждый поток — просто число, которое периодически меняется. То есть есть 5 тыс чисел, каждое из которых периодически меняется.

Есть 1 млн юзеров (клиентов, допустим, моб приложения). Каждый клиент хочет подписаться (по WebSocket или еще как) на какой-либо поток данных.

То есть на каждый поток данных приходися по 200-1000 подписчиков.

Если брать понятную аналогию, то это как сервер с котировками, которые постоянно меняются, и тысячи приложений которые получают котировки от этого сервера.

Вопрос: как сделать такой сервер? Есть ли что-то готовое? Я с таким кол-вом соединений никогда не сталкивался, и в целом то задача кажется не трудная — получил новое число, отправил в 1000 соединений, но есть сомнения что это будет быстро работать.

Где-то читал что Netty держит огромное кол-во содениений без проблем — это так?


Решения вопроса 0


Ответы на вопрос 3



@sergey-gornostaev Куратор тега Java

Да, про Netty правда. Только он очень низкоуровневый, лучше взять Spring WebFlux или Play Framework.



@sergiks

Исходя из недавнего опыта я бы предложил 5 серверов со Swoole (писать на PHP а не Java) По 200к соединений на каждый, DNS round robin (надеяться, что равномерно раскидает подключения). Или прятаться за load balancer’ом, но тогда каждый сетевой интерфейс примет меньшее число соединений, не более 65к в теории, меньше на практике.

Использовать Redis в качестве PubSub брокера. Из каждого сервера подписаться на сообщения из Redis.

При подключении WebSocket клиента его подписки хранить в Memory Table того сервера, куда он подключился. Ключ $fd подключения, в колонках держать 1/0 на каждый из 1000 каналов, или просто перечислить номера каналов через разделитель в единственном строковом поле.
При поступлении сообщения (новой цифры в одной из подписок) в цикле обходить таблицу (все подключения этого сервера) и отправлять сообщение тем, у кого включена данная подписка.



@d-stream

Это уже сродни мультикастам (iptv), где большая часть нагрузки лежит на транспорте (коммутаторах) а не на софтовой стороне.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *