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