繁体   English   中英

扩展执行繁重计算的 node.js websocket 服务器

[英]Scaling a node.js websocket server that does heavy computations

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

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

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

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

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

第一 -

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

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

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

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

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

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM