Задать вопрос

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

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

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

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

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

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

Где-то читал, что Netty держит огромное кол-во соединений без проблем - это так?
  • Вопрос задан
  • 566 просмотров
Подписаться 8 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Java-разработчик с нуля
    12 месяцев
    Далее
  • Яндекс Практикум
    Java-разработчик расширенный
    14 месяцев
    Далее
  • Академия Эдюсон
    Java-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 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 каналов, или просто перечислить номера каналов через разделитель в единственном строковом поле.

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

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

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