[作为一个小型上下文提供者:我是网络和零MQ 的新手,但我确实花了很多时间在指南和示例上]
我有以下挑战(用 C++ 完成,但与问题无关)。我有一个生成任务的单一来源。我有多个引擎需要处理这些任务,然后发回结果。
第一次尝试: 我创建了一个带有 ZMQ_PUSH 套接字的客户端。引擎有一个 ZMQ_PULL 套接字。为了将答案返回给客户端,我创建了相反的操作:工作人员上的 ZMQ_PUSH 和客户端上的 ZMQ_PULL。它开箱即用。只是发现一段时间后客户端内存不足,因为我推送的请求超出了工作人员的处理能力。我需要一些背压。
第二次尝试: 我在客户端添加了一个计数器,仅在不超过 1000 个任务“正在进行”时才负责推送。内存不足的问题得到了解决,因为我从来没有超过 1000 个“正在进行”的任务。但是……有些工人比其他工人慢。由于 PUSH/PULL 使用公平排队,因此该慢速工作人员的工作量不断增加......直到最慢的工作人员将所有 1000 个请求排队,而其他人则被饿死。我没有有效地使用我的员工。
现在,我可以使用什么架构来解决“不同速度的工人”的问题?“计算进行中任务的数量”方法是平衡推送请求数量的好方法吗?或者有没有办法可以将任务推送给工作人员,并在预定义的点上推送块?我可以用 HWM 做到这一点吗?
我确信这个问题具有如此普遍的性质,我应该能够轻松处理这个问题。谁能指出我正确的方向?
谢谢!