2011-02-11 241 views
8

RabbitMQ爲我正在計劃的項目打勾,保存一個。我會讓不同的工作人員在隊列中進行監聽,並且他們首先處理最新的消息(即最新的序列號)(LIFO)是很重要的。RabbitMQ重排消息

我的應用程序是這樣的新消息幾乎過時的舊信息。如果你有工作人員,你仍然可以處理舊信息,但重要的是先做好新信息。

拖網各種論壇和這樣我只能看到一個解決方案,這是對客戶端來處理消息時,它應該首先之後:

  • 消耗所有消息他們根據
  • 再定購序列號
  • 重新提交給隊列
  • 消耗所述第一消息

醜陋和PROBL如果客戶中途死亡,則爲ematic。但是,這裏的mabye有一個更好的解決方案。

我的研究是基於(部分):

注:消息的預期流量將大約在一些隊列的1msg /小時和100 /分鐘的範圍其他人。所以沒有什麼恆星。

回答

3

由於沒有回覆我想我做功課相當好;)

不管怎麼說,討論與其他利益相關者就決定我可以刪除LIFO要求對於現在的要求了。當涉及到它時,我們可以擔心。

我們可能最終採用的解決方案是讓工作人員打開第二個隊列,讓主人可以使用它讓工作人員知道要忽略哪些工作+提供額外的控制/監視信息(看起來我們會無論如何需要)。

執行AMQP 1.0規範的RabbitMQ在這裏也可能有所幫助。

所以我會將這個問題標記爲現在的答案。其他人仍然可以自由添加或改進。

1

一種可能性是在一個循環中使用basic.get並等待響應basic-ok.message-count成爲零(扔掉所有其他消息):

while (<get ok> = <call basic.get>) { 
    if (<get ok>.message-count == 0) { 
    // Now <get ok> is the most recent message on this queue 
    break; 
    } else if (<is get-empty>) { 
    // Someone else got it 
    } 
} 

當然,你必須設置消息在代理上路由模式,這樣一個消費者扔掉消息不會混淆另一個消費者。儘量避免重新排列消息,因爲它們將重新排列在堆棧頂部,使它們看起來像最近一樣。

+0

感謝您的回覆。但是,我不希望一個消費者捱餓其他人的工作。我寧願讓其他消費者使用稍微不太新的消息(它們仍然提供一些信息),而不是讓消費者X空閒隊列,而讓它們閒置。雖然這也取決於我猜測的消息速率。 – dgorissen 2011-03-09 10:27:44