Node.js Кластер для нескольких клиентов WebSocket, подключающихся к различным серверам WebSocket? - PullRequest
2 голосов
/ 16 января 2020

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

foo = new WebSocket('ws://foo.host ...')
bar = new WebSocket('ws://barhost ...')
baz = new WebSocket('ws://baz.host ...')
qux = new WebSocket('ws://qux.host ...')

foo.on('data', data => doSomething(data))  // 5 events per second 
bar.on('data', data => doSomething(data))  // 1 events per second 
baz.on('data', data => doSomething(data))  // 1 events per second 
qux.on('data', data => doSomething(data))  // 1 events per second 

Вопрос: Если у нас многоядерная система (например, .4 ядра), возможно ли использовать Node.js Cluster для балансировки нагрузки при обработке входящих данных Websocket, так что каждое ядро ​​будет приблизительно получать 2 события в секунду для обработки?

Или Лучше вручную запустить 8 node.js экземпляров и передать ему аргумент [foo | bar | baz | qux] для выбора сервера Websocket, к которому он будет подключаться?

1 Ответ

2 голосов
/ 16 января 2020

Модуль кластеризации nodejs решает одну конкретную проблему c. Когда у вас есть http-сервер, и вы хотите распределить нагрузку входящих соединений между несколькими процессами, это то, что делает модуль кластеризации nodejs. Это не то, что у вас есть. У вас есть несколько исходящих подключений webSocket на стороне клиента, и вы, очевидно, хотите применить несколько процессов для обработки входящих данных. Это полностью отличается от того, что делает кластерный модуль nodejs.

Во-первых, важно понимать, что получение данных не является ресурсоемким процессом для nodejs. Фактическая обработка сокетов и получение входящих данных на компьютер обрабатывается ОС и находится за пределами процесса nodejs.

Так что, если вам действительно требуется более одного ЦП для работы с этим, это должно быть обрабатывать входящие данные, а не просто получать их.

Существует несколько различных способов структурирования.

  1. У вас может быть один центральный процесс, содержащий все webSockets, а также количество рабочих процессов или рабочих потоков, в которые вы передаете входящие данные для обработки. Это применило бы много ЦП к обработке данных и позволило бы распределить обработку нагрузки между ЦП независимо от того, в какой сокет поступили данные.

  2. Вы можете создать 4 отдельных дочерних элемента. процессы и каждый дочерний процесс создает одно из четырех соединений webSocket, а затем каждый дочерний процесс обрабатывает только входящие данные для своего webSocket. Недостатком этого метода является то, что он применяет только один процесс к каждому webSocket, и если большая часть данных поступает в один webSocket, другие процессы будут в основном простаивать.

  3. Если один webSocket имеет намного больше нагрузки, чем другие, и по какой-то причине вариант # 1 не будет работать хорошо, тогда вы можете объединить # 1 и # 2. Создайте отдельный процесс для каждого webSocket, а затем создайте несколько рабочих потоков для обработки входящих данных для каждого из них. Создайте рабочую очередь, в которую вставляются входящие данные, и работу можно отправлять каждому рабочему потоку, когда он завершает свой предыдущий фрагмент данных.

...