我有一种情况,我使用 PM2 创建了一个 Node.js 集群。向工作人员发出的单个请求将花费相当长的时间(2 分钟以上),因为它正在执行密集计算(在一系列步骤中),在不同阶段有几个 I/O 操作(步骤 1 是“通过 HTTP 下载”,一个中间和最后一步是“写入磁盘”)。向集群发送请求的客户端会通过两个因素限制它发送的请求:
- 频率(每秒多少个请求),我们使用慢速(每秒1个)
- 它可以发出多少个打开请求,我们使它小于或等于我们在集群中拥有的节点数
例如,如果集群有 10 个节点,那么客户端只会以每秒 1 个的速度向集群发送 10 个请求,并且不会再发送任何请求,直到有一个或多个请求返回成功或失败,这意味着一个或更多的工作人员现在应该有空做更多的工作,然后客户端将发送更多的工作到集群。
在观察服务器上的负载时,负载均衡器似乎并没有像经典循环分配模式所期望的那样均匀地分配工作。发生的情况是,当集群中有空闲的工作人员时,单个工作人员(通常是第一个工作人员)将收到大量请求。这最终将使工人发生故障。
我们实施了一种机制,以防止工作人员在处理前一个请求时继续处理新请求。这防止了故障,但是尽管集群有空的工作人员,但仍然有很多请求被拒绝服务!
您能想到这种行为发生的原因,或者如何改进 PM2 的工作方式吗?