C++ 如何设置ZERO-MQ体系结构以处理不同速度的工作人员

C++ 如何设置ZERO-MQ体系结构以处理不同速度的工作人员,c++,networking,zeromq,C++,Networking,Zeromq,[作为一个小型上下文提供者:我对网络和ZERO-MQ不熟悉,但我确实花了很多时间在指南和示例上] 我有以下的挑战(用C++完成,但与问题无关)。我有一个生成任务的源。我有多个引擎需要处理这些任务,并返回结果 第一次尝试: 我创建了一个带有ZMQ_推送套接字的客户端。发动机有一个ZMQ_拉插座。为了将答案返回给客户,我创建了一个相反的方法:一个ZMQ_推压工人,一个ZMQ_拉压客户。它是开箱即用的。结果发现,一段时间后,客户机内存不足,因为我推送的请求远远超过了工作人员的处理能力。我需要一些背压

[作为一个小型上下文提供者:我对网络和ZERO-MQ不熟悉,但我确实花了很多时间在指南和示例上]

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

第一次尝试: 我创建了一个带有ZMQ_推送套接字的客户端。发动机有一个ZMQ_拉插座。为了将答案返回给客户,我创建了一个相反的方法:一个ZMQ_推压工人,一个ZMQ_拉压客户。它是开箱即用的。结果发现,一段时间后,客户机内存不足,因为我推送的请求远远超过了工作人员的处理能力。我需要一些背压

第二次尝试: 我在客户机上添加了一个计数器,它只负责在不超过1000个任务“正在进行”时推送。内存不足的问题得到了解决,因为我从未有过超过1000个“正在进行”的任务。但是有些工人比其他人慢。由于推/拉使用公平排队,因此速度较慢的工作人员的工作量不断增加……直到速度最慢的工作人员将所有1000个请求都排队,而其他工作人员则处于饥饿状态。我没有有效地使用我的员工

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

我相信这是一个非常普遍的问题,我应该能够很容易地处理这个问题。谁能给我指出正确的方向吗


谢谢

我们使用了偏执狂海盗协议

但对于许多非常小的作业,通信开销可能很高,基于信用的流控制模式可能更有效


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

我们使用了偏执狂海盗协议

但对于许多非常小的作业,通信开销可能很高,基于信用的流控制模式可能更有效

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