首页 > 解决方案 > 扩展执行繁重计算的 node.js websocket 服务器

问题描述

我有一个带有一个接收大量消息的 websocket 连接的 node.js 服务器。该服务器还执行繁重的 cpu 工作。我看到 ws 连接不断丢弃/重新连接/丢弃/等。我的猜测是cpu工作阻塞了主线程这么多,同时ws收到这么多消息,ws连接就失败了?

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

服务器是有状态的,这个服务器只能有 1 个,所以我不能再启动更多。

我不确定如何进行。一些想法是:

  1. 将 cpu 工作转移到另一个进程中,并通过某种进程间通信方法进行通信。但这比 worker_thread 更好吗?
  2. 水平扩展 websocket,所以如果一个失败,其他的就会弥补。以这种方式扩展 websocket 似乎相当复杂。

标签: node.jskuberneteswebsocket

解决方案


第一 -

//服务器是有状态的,这台服务器只能有1台,不能随便多转。

你应该去掉这个瓶颈。只要你有这个,你将无处可去。扩展的想法是在应用程序的副本之间分配网络和 cpu 工作负载。

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

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

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

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/


推荐阅读