我的 node.js 应用程序当前订阅了许多 websocket 服务器,这些服务器开始每秒将大量数据推送到应用程序。此 websocket 客户端应用程序有几个事件处理程序,它们在接收 websocket 数据后执行一些工作。
但是,Node.js 似乎在任何时候都只使用 1 个 CPU 核心,其余核心未得到充分利用。这是预期的,因为 Node.js 使用单线程事件循环模型。
是否可以在多个 CPU 核心上对传入的 Websocket 数据处理进行负载平衡?我明白Node Cluster和 pm2
Cluster Mode如果您正在运行 websocket 服务器,则能够实现负载平衡,但是 websocket 客户端呢?
最佳答案
从客户端来看,我可以想到以下选项:
创建一些子进程(可能为您拥有的每个 CPU 核心创建一个子进程),然后在这些子进程之间划分您的 webSocket 连接。
创建 node.js
WorkerThreads
(可能为您拥有的每个 CPU 核心创建一个),然后在这些 WorkerThreads 之间划分您的 webSocket 连接。创建node.js
WorkerThreads
(可能为您拥有的每个CPU核心一个)并创建一个工作队列,其中来自各个webSocket连接的每个传入数据都被放入工作队列中。然后,WorkerThreads 定期从队列中分派(dispatch)数据来处理。当他们完成一条数据时,就会从队列中获得下一条数据,依此类推......
如何最好地解决这个问题实际上取决于 CPU 时间主要花在哪里。如果处理传入数据花费了最多时间,那么这些解决方案中的任何一个都将有助于将多个 CPU 应用于该任务。如果是实际接收传入数据,那么您可能需要将传入的 webSocket 本身移动到新的线程/进程,如前两个选项所示。
如果是由于数据量而导致的系统带宽问题,那么您可能需要增加网络连接的带宽,或者可能需要涉及多个网络适配器。
关于javascript - Node.js CPU 负载平衡多个 CPU 内核上的 Websocket 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60139389/