Node.js CPU 在多个 CPU 内核上对 Web 套接字客户端进行负载平衡



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

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

是否可以在多个 CPU 内核上对传入的 websocket 数据处理进行负载平衡?我知道如果您正在运行 websocket 服务器,节点群集和pm2群集模式能够进行负载平衡,但是 websocket 客户端呢?

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

  1. 创建一些子进程(可能每个 CPU 内核一个子进程(,然后在这些子进程之间划分 webSocket 连接。

  2. 创建节点.jsWorkerThreads(可能为您拥有的每个 CPU 内核创建一个节点(,然后在这些 WorkerThread 之间划分您的 webSocket 连接。

  3. 创建节点.jsWorkerThreads(可能为您拥有的每个 CPU 内核创建一个节点(并创建一个工作队列,其中来自各种 webSocket 连接的每个传入数据片段都放入工作队列中。 然后,WorkerThreads 是队列中要处理的常规分派数据。 当他们完成一条数据时,他们会从队列中获得下一条数据,依此类推......

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

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

最新更新