[作为一个小的上下文提供者:我是网络和ZERO-MQ的新手,但我确实花了很多时间在指南和示例上]
我遇到了以下挑战(在C ++中完成,但与问题无关)。我有一个生成任务的单一来源。我有多个引擎需要处理这些任务,并发回结果。
首次尝试: 我创建了一个带有ZMQ_PUSH套接字的客户端。引擎有一个ZMQ_PULL套接字。为了得到客户端的答案,我创建了反向:工作者的ZMQ_PUSH和客户端的ZMQ_PULL。它开箱即用。只是发现经过一段时间后客户端内存不足,因为我推送的请求比工作人员处理的要多。我需要一些背压。
第二次尝试: 我在客户端添加了一个计数器,当只有1000个任务正在进行时,它只负责推送。内存不足问题已经解决,因为我从来没有超过1000个'进行中'任务。但是......一些工人比其他人慢。由于PUSH / PULL使用公平排队,因此缓慢工作者的工作量不断增加和增加......直到最慢的工作人员排队所有1000个请求并且其他人被饿死。我没有有效地使用我的工人。
现在,我可以使用哪种架构来解决“速度不同的工人”的问题? '计算正在进行的任务数'是否是平衡推送请求数量的好方法?或者,有没有办法可以将任务推送给工人,以及推送块在预定义的点上?我可以用HWM做到吗?
我确信这个问题具有如此普遍的性质,我应该能够轻松解决这个问题。有人能指出我正确的方向吗?
谢谢!
答案 0 :(得分:1)
我们使用了Paranoid Pirate Protocol http://rfc.zeromq.org/spec:6,
但是如果许多非常小的工作,通信的开销可能很高,基于信用的流量控制模式可能会更有效。 http://unprotocols.org/blog:15
在这两种情况下,请求者都必须直接将工作分配给各个工人。当然,这是抽象的,根据用例,可以作为同步调用提供,在所有任务处理完毕后返回。