Как Сервер отслеживает всех Клиентов, подключенных в режиме передачи данных в режиме реального времени? - PullRequest
0 голосов
/ 18 июня 2019

Я понимаю, что Websocket - это протокол, который используется для потоковой передачи данных в реальном времени.

Мой вопрос может быть очень преждевременным, но он не может найти много помощи в Интернете.

Скажем, 1000 клиентов подключены к серверу, который в режиме реального времени рассылает цены на акции.Когда на фронте сервера происходит обновление, как сервер узнает все 1000 клиентов, которым необходимо отправить обновление?

Если это какой-то цикл, который происходит на стороне сервера, где все подключенные клиентыдетали кэшируются, и тогда всем будет отправлено обновление, не является ли это издержками?

Этот ответ SOF имел некоторый смысл, но не прояснил мои сомнения.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Как Сервер отслеживает всех Клиентов, подключенных в сценарии перетаскивания данных в режиме реального времени?

Он не ... он только сохраняетотслеживание клиентов, которые он специально сохраняет.

Этот ответ не относится к node.js.

Скажем, 1000 клиентов подключены к серверу, который в режиме реального времени рассылает цены на акции.Когда на фронте сервера происходит обновление, как сервер узнает все 1000 клиентов, которым необходимо отправить обновление?

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

Очевидно, что разумный дизайн потребует избыточности, поэтому ни одна служба не будет содержать все 1 миллион подключений (и в случае сбоя одного экземпляра сервера клиенты могут повторноподключиться к другому экземпляру сервера).

В этом случае не существует одного сервера, который бы знал обо всех клиентах.

Для каждого сервера более целесообразно управлять собственной внутренней подпиской / клиентомсписок.Каждый сервер также будет действовать как клиент pub / sub для централизованного сервиса pub / sub (такого как кластер Redis или любой другой).

Если предположить, что 1000 экземпляров сервера, каждый из которых обслуживает 1000 клиентов, мы бы обнаружили, чтоСлужба pub / sub знает только о 1000 «клиентов» (экземпляров сервера).Каждый сервер не знает о других клиентах, он знает только о 1000 клиентах, которыми он управляет.

Если это какой-то цикл, который происходит на стороне сервера, где все данные подключенных клиентов кэшируются и затемобновление будет разослано всем им, не является ли это издержками?

Сам алгоритм зависит от реализации, но в целом каждый сервер будет нести определенные издержки для управления pub /подуровень.

Однако, поскольку каждый сервер управляет только небольшим подмножеством общего количества клиентов, накладные расходы распределяются по ряду систем.

Ориентированный на канал и ориентированный на соединение проект

Вероятно, я должен отметить, что дизайн паба / субабонента не ориентирован на соединение.

Сервер не (не должен) зацикливаться на всех соединениях, спрашивая: «Вы подписаны на этот канал?»"?.

Скорее, дизайн pub / sub предполагает дизайн, ориентированный на" канал ", в котором он находит объект (ы) канала и проходит по циклу.список клиентов.

С одной стороны, этот подход может (или не может) потреблять больше памяти.Поскольку каждый «канал» должен содержать список клиентов, прослушивающих этот канал, один клиентский объект может принадлежать более чем одному списку.

С другой стороны, цикл имеет меньше ветвей кода и имеет меньше накладных расходов.чем дизайн, ориентированный на соединение.Кроме того, этот подход позволяет использовать клиенты pub / sub, которые не связаны с подключением (например, внутренние перехватчики / обратные вызовы).

1 голос
/ 18 июня 2019

Скажем, 1000 клиентов подключены к серверу, который в режиме реального времени рассылает цены на акции.Когда на фронте сервера происходит обновление, как сервер узнает все 1000 клиентов, которым необходимо отправить обновление?

Socket.io уже отслеживает сам по себе и его довольно легко испуститьдля всех подключенных клиентов.

Socket.io - Emit Cheatsheet

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

Если вы на самом деле заканчиваете масштабированием и имеете более одного серверного узла, тогда вы можете использовать socketio-redis .

Adapter to enable broadcasting of events to multiple separate socket.io server nodes.
...