Node.js клиент Websocket балансировки нагрузки ЦП по нескольким ядрам ЦП

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

Тем не менее, Node.js, похоже, использует только 1 ядро ​​ЦП в любой момент, оставив оставшиеся ядра незадействованными. Это ожидается, поскольку Node.js использует модель однопоточного цикла событий.

Можно ли сбалансировать загрузку обработки входящих данных веб-сокета по нескольким ядрам ЦП? Я понимаю, что кластер узлов и _ 1_ Cluster Mode могут балансировать нагрузку, если вы используете серверы websocket, но как насчет клиентов websocket?


person Nyxynyx    schedule 09.02.2020    source источник
comment
@Flimzy Есть ли способ запустить несколько рабочих экземпляров из основного процесса Node.js, а затем каким-то образом позволить главному процессу Node.js балансировать нагрузку на обработку входящих данных веб-сокета на нескольких ядрах ЦП?   -  person Nyxynyx    schedule 09.02.2020
comment
Вы можете разветвлять столько процессов, сколько хотите (и что ваше оборудование может поддерживать). Мое личное мнение, которое может быть спорным, заключается в том, что Node не является подходящим инструментом для одновременных рабочих нагрузок.   -  person Flimzy    schedule 09.02.2020
comment
@Flimzy Я согласен с вами, что Node.js - не лучший выбор в этой ситуации. Между тем, балансировка нагрузки существующего приложения Node может быть быстрее, чем переписывание всего приложения чем-то вроде Golang или Elixir / Phoenix.   -  person Nyxynyx    schedule 09.02.2020
comment
да, быстрое исправление наверняка будет запускать несколько экземпляров.   -  person Flimzy    schedule 09.02.2020


Ответы (1)


Со стороны клиента я могу думать о следующих вариантах:

  1. Создайте несколько дочерних процессов (вероятно, по одному для каждого ядра ЦП), а затем разделите соединения webSocket между этими дочерними процессами.

  2. Создайте node.js WorkerThreads (вероятно, по одному для каждого ядра ЦП), а затем разделите свои соединения webSocket между этими WorkerThreads.

  3. Создайте node.js WorkerThreads (вероятно, по одному для каждого ядра ЦП) и создайте рабочую очередь, в которой каждый входящий фрагмент данных из различных соединений webSocket помещается в рабочую очередь. Затем WorkerThreads - это обычные отправленные данные из очереди для работы. Когда они завершают часть данных, им предоставляется следующий фрагмент данных из очереди и так далее ...

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

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

person jfriend00    schedule 09.02.2020