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

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

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

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

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

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

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

Где-то читал что Netty держит огромное кол-во содениений без проблем - это так?
  • Вопрос задан
  • 536 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Да, про Netty правда. Только он очень низкоуровневый, лучше взять Spring WebFlux или Play Framework.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Это уже сродни мультикастам (iptv), где большая часть нагрузки лежит на транспорте (коммутаторах) а не на софтовой стороне.
Ответ написан
Комментировать
Исходя из недавнего опыта я бы предложил поднять несколько серверов со Swoole (писать на PHP а не Java) Например, по 200к соединений на каждый (с белыми IP).

DNS round robin: одно имя указывает на несколько IP и надеяться, что равномерно раскидает подключения. Или прятаться за load balancer'ом, но тогда каждый сетевой интерфейс примет меньшее число соединений, не более 65к в теории, меньше на практике.

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

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

При поступлении сообщения (новой цифры в одной из подписок) в цикле обходить таблицу (все подключения этого сервера) и отправлять сообщение тем, у кого включена данная подписка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы