2011-03-07 46 views
2

我有以下情形:Qpid - 負載均衡的消息對消費者有不同的性能特點

我推100個消息2名消費者共享的隊列。兩個訂閱者都以預獲取模式和顯式模式訂閱隊列。在處理每條消息之後,每個訂閱者接受消息以將其從隊列中刪除。僞代碼看喜歡的是:

OnMessageTransfer(message) : 
    DoSomethingWithMessage(message) 
    Session.MessageAccept(message) 

的消息是正確的負載平衡,每個消息被處理一次,只有一次,但我們發現,它並沒有考慮到每個消費者的處理時間。例如,讓我們假設消費者A正在花費50ms來處理消息,而消費者B正在花費5秒鐘。理想情況下,消費者B應該開始處理1條消息,同時消費者A應該處理另外99條消息。但是,發生的情況是消費者B將在50秒內實際處理25條消息,而消費者A將在約4秒內處理另外75個消息並且將閒置。客戶端API似乎預取了這些消息,這在這種情況下顯然是非最優的。

我們該如何解決這個問題?

我們使用Qpid CPP 0.5和完全託管的C#0-10客戶端API,而不是CPP綁定(但我的理解是,這種行爲是未鏈接到API的實現)

的問候,

Julien

回答

2

此行爲可通過配置隊列的消息流進行更改。爲避免預取消息,應將其設置爲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 
+0

大自答案! –

相關問題