1

[作为一个小型上下文提供者:我是网络和零MQ 的新手,但我确实花了很多时间在指南和示例上]

我有以下挑战(用 C++ 完成,但与问题无关)。我有一个生成任务的单一来源。我有多个引擎需要处理这些任务,然后发回结果。

第一次尝试: 我创建了一个带有 ZMQ_PUSH 套接字的客户端。引擎有一个 ZMQ_PULL 套接字。为了将答案返回给客户端,我创建了相反的操作:工作人员上的 ZMQ_PUSH 和客户端上的 ZMQ_PULL。它开箱即用。只是发现一段时间后客户端内存不足,因为我推送的请求超出了工作人员的处理能力。我需要一些背压。

第二次尝试: 我在客户端添加了一个计数器,仅在不超过 1000 个任务“正在进行”时才负责推送。内存不足的问题得到了解决,因为我从来没有超过 1000 个“正在进行”的任务。但是……有些工人比其他工人慢。由于 PUSH/PULL 使用公平排队,因此该慢速工作人员的工作量不断增加......直到最慢的工作人员将所有 1000 个请求排队,而其他人则被饿死。我没有有效地使用我的员工。

现在,我可以使用什么架构来解决“不同速度的工人”的问题?“计算进行中任务的数量”方法是平衡推送请求数量的好方法吗?或者有没有办法可以将任务推送给工作人员,并在预定义的点上推送块?我可以用 HWM 做到这一点吗?

我确信这个问题具有如此普遍的性质,我应该能够轻松处理这个问题。谁能指出我正确的方向?

谢谢!

4

1 回答 1

1

我们使用了Paranoid Pirate Protocol http://rfc.zeromq.org/spec:6

但是在许多非常小的工作中,通信开销可能很高,基于信用的流控制模式可能更有效。http://unprotocols.org/blog:15

在这两种情况下,请求者都需要直接将工作分配给单个工人。这当然是抽象出来的,并且根据用例,可以作为同步调用提供,当所有任务都被处理后返回。

于 2012-06-14T13:47:38.763 回答