缩放node.js的websocket服务器,该服务器会进行繁重的计算



我有一个node.js服务器,它有一个接收大量消息的websocket连接。这个服务器也做繁重的cpu工作。我看到ws连接不断断开/重新连接/断开/等等。我的猜测是,cpu的工作阻塞了主线程太多,同时ws收到了太多消息,以至于ws连接失败了?

我最初的解决方案是将所有cpu工作转移到nodeworker_thread,这有点帮助,但我仍然看到ws失去了很多连接。我的想法是,节点应该在网络IO方面非常高效,所以如果我把所有的cpu工作转移到另一个线程中,网络工作就不会被cpu工作阻塞。

服务器是有状态的,这个服务器只能有1个,所以我不能再旋转了。

我真的不知道该怎么办。一些想法是:

  1. 将cpu工作转移到另一个进程中,并通过一些进程间通信方法进行通信。但是,这怎么比worker_thread更好呢
  2. 横向扩展websocket,所以如果其中一个失败,其他的就会填补空缺。以这种方式扩展websocket似乎相当复杂

第一-

//服务器是有状态的,这个服务器只能有1个,所以我不能再旋转了。

你应该去掉这个瓶颈。只要你有这个,你就不会去任何地方。扩展的概念是在应用程序的副本之间分配网络和cpu工作负载。

如果服务器已满状态,请创建一个处理所有状态信息的状态控制器服务器。启动应用程序的副本,并在副本和状态控制器服务器之间建立集群内通信。

完成此设置后,请创建一个负载平衡器,它可以单独检查复制副本的准备情况,并将流量转发到可用的复制副本。别忘了,在NodeJS中,网络处理发生在内核级别。因此,操作系统机制将在前线处理负载,并保持请求等待,直到工作负载准备好处理它们。此设置允许您控制阈值,如副本数量和准备超时,这可以为性能微调扫清道路。这些调整取决于实际情况,如您的请求数据、响应数据、处理时间等。

好消息是,几乎所有的容器编排系统都提供了以上所有功能。大多数情况下,您将不得不自己处理状态的服务器。

https://kubernetes.io/docs/concepts/cluster-administration/networking/https://kubernetes.io/docs/concepts/workloads/controllers/deployment/https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

最新更新