javascript - Node.js CPU 负载平衡多个 CPU 内核上的 Websocket 客户端

标签 javascript node.js websocket pm2 node-cluster

我的 node.js 应用程序当前订阅了许多 websocket 服务器,这些服务器开始每秒将大量数据推送到应用程序。此 websocket 客户端应用程序有几个事件处理程序,它们在接收 websocket 数据后执行一些工作。

但是,Node.js 似乎在任何时候都只使用 1 个 CPU 核心,其余核心未得到充分利用。这是预期的,因为 Node.js 使用单线程事件循环模型。

是否可以在多个 CPU 核心上对传入的 Websocket 数据处理进行负载平衡?我明白Node Clusterpm2 Cluster Mode如果您正在运行 websocket 服务器,则能够实现负载平衡,但是 websocket 客户端呢?

最佳答案

从客户端来看,我可以想到以下选项:

  1. 创建一些子进程(可能为您拥有的每个 CPU 核心创建一个子进程),然后在这些子进程之间划分您的 webSocket 连接。

  2. 创建 node.js WorkerThreads(可能为您拥有的每个 CPU 核心创建一个),然后在这些 WorkerThreads 之间划分您的 webSocket 连接。

  3. 创建node.js WorkerThreads(可能为您拥有的每个CPU核心一个)并创建一个工作队列,其中来自各个webSocket连接的每个传入数据都被放入工作队列中。然后,WorkerThreads 定期从队列中分派(dispatch)数据来处理。当他们完成一条数据时,就会从队列中获得下一条数据,依此类推......

如何最好地解决这个问题实际上取决于 CPU 时间主要花在哪里。如果处理传入数据花费了最多时间,那么这些解决方案中的任何一个都将有助于将多个 CPU 应用于该任务。如果是实际接收传入数据,那么您可能需要将传入的 webSocket 本身移动到新的线程/进程,如前两个选项所示。

如果是由于数据量而导致的系统带宽问题,那么您可能需要增加网络连接的带宽,或者可能需要涉及多个网络适配器。

关于javascript - Node.js CPU 负载平衡多个 CPU 内核上的 Websocket 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60139389/

相关文章:

javascript - onclick 定位特定类

javascript - 有没有更好的方法在每个模块中要求 Backbone、jQuery、下划线等?

java - Jetty 如何创建自定义 WebSocket

node.js - 无法将 Angular 应用程序部署到openshift: “Argument error, options.body.”

python - FastAPI websocket 示例是否使进程死锁?

java - grizzly + jersey + websocket - 不接受连接

javascript - 查询。从数字类型输入中获取输入值。比较时它返回真,我不知道为什么

javascript - 检查某些值是否匹配多个值的最佳方法是什么?

javascript, 日历

node.js - 在 Node.js 中解析 XML 会导致内存使用量极大