Node.js балансировка нагрузки ЦП клиента Websocket через несколько ядер ЦП - PullRequest
1 голос
/ 09 февраля 2020

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

Однако Node.js, похоже, использует только одно ядро ​​ЦП одновременно, оставляя оставшиеся ядра недоиспользуемыми. Это ожидается, поскольку Node.js использует однопоточное событие модели l oop.

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

1 Ответ

1 голос
/ 09 февраля 2020

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

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

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

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

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

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

...