node.js - 扩展执行繁重计算的 node.js websocket 服务器
问题描述
我有一个带有一个接收大量消息的 websocket 连接的 node.js 服务器。该服务器还执行繁重的 cpu 工作。我看到 ws 连接不断丢弃/重新连接/丢弃/等。我的猜测是cpu工作阻塞了主线程这么多,同时ws收到这么多消息,ws连接就失败了?
我最初的解决方案是将所有 cpu 工作转移到一个节点 worker_thread,这有点帮助,但我仍然看到 ws 失去了很多连接。我的想法是,node 应该在网络 IO 上非常高效,所以如果我将所有 cpu 工作转移到另一个线程中,网络工作就不会被 cpu 工作阻塞。
服务器是有状态的,这个服务器只能有 1 个,所以我不能再启动更多。
我不确定如何进行。一些想法是:
- 将 cpu 工作转移到另一个进程中,并通过某种进程间通信方法进行通信。但这比 worker_thread 更好吗?
- 水平扩展 websocket,所以如果一个失败,其他的就会弥补。以这种方式扩展 websocket 似乎相当复杂。
解决方案
第一 -
//服务器是有状态的,这台服务器只能有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/
推荐阅读
- batch-file - 如果文件不是至少 N 天,如何在批处理文件中指定不删除文件?
- rxjs - 无法运行最简单的 rxjs-marbles 测试
- react-native - react native 中的日历事件
- java - 执行简单 SPRING MVC 示例时出现异常严重:子容器在启动 java.util.concurrent 期间失败
- typescript - 在 Promise 库上创建一个通用接口
- javascript - javascript中的类追加和删除
- node.js - 在流星中完成页面加载后如何调用函数?
- unity3d - 如何使用 UnityWebRequest 在 Unity 中编写 HTTP 发布请求?
- java - 我无法将 Tomcat webapp 配置为能够在 Eclipse 上进行调试
- ssh - GitLab.com 配置文件上的备用 SSH 连接