.net Qpid-发送给具有不同性能特征的使用者的负载平衡消息

.net Qpid-发送给具有不同性能特征的使用者的负载平衡消息,.net,load-balancing,amqp,qpid,.net,Load Balancing,Amqp,Qpid,我有以下情况: 我将100条消息推送到一个由2个消费者共享的队列中。两个订阅者都以预获取模式和显式模式订阅队列。处理每条消息后,每个订户都会接受该消息以将其从队列中删除。伪代码如下所示: OnMessageTransfer(message) : DoSomethingWithMessage(message) Session.MessageAccept(message) 消息的负载平衡正确,每条消息只处理一次,但我们发现它没有考虑每个消费者的处理时间。例如,假设消费者A处理消息需

我有以下情况:

我将100条消息推送到一个由2个消费者共享的队列中。两个订阅者都以预获取模式和显式模式订阅队列。处理每条消息后,每个订户都会接受该消息以将其从队列中删除。伪代码如下所示:

OnMessageTransfer(message) :
    DoSomethingWithMessage(message)
    Session.MessageAccept(message)
消息的负载平衡正确,每条消息只处理一次,但我们发现它没有考虑每个消费者的处理时间。例如,假设消费者A处理消息需要50毫秒,消费者B处理消息需要5秒钟。理想情况下,使用者B应该开始处理1条消息,同时,使用者A应该处理其他99条消息。然而,实际情况是,使用者B将在50秒内处理25条消息,而使用者A将在~4秒内处理75条其他消息,并将空闲。客户端api似乎预取了消息,这在这种情况下显然不是最优的

我们如何解决这个问题

我们使用的是Qpid cpp 0.5和完全管理的c#0-10客户端API,而不是cpp绑定(但我的理解是,这种行为与API的实现无关)

问候,


Julien

可以通过配置队列的消息流来更改此行为。为避免预取消息,应将其设置为1条消息的信用,并在处理每条消息后进行更新。伪代码如下所示:

InitSubscription(queue) : 
    MessageSubscribe(queue, AcceptMode.Explicit, AcquireMode.PreAcquired)
    MessageSetFlowMode(queue, FlowMode.Credit)
    MessageFlow(queue, CreditUnit.Byte, MAX_BYTES)
    MessageFlow(queue, CreditUit.Message, 1) // will disable prefetch

OnMessageTransfer(message) :
    DoSomethingWithMessage(message)
    MessageAccept(message)
    MessageFlow(queue, CreditUit.Message, 1) // reissue a credit for 1 and only 1 message