2016-04-25 143 views
1

我們有這樣一個場景:在幾個節點如何在使用Rabbitmq時設置消息自動重試並設置ttl = 0?

可能有很多工人(a.k.a消費者),在此期間,Web應用將在線提交作業這些工人。我們需要平均處理這些工作,並知道是否有可用的工作人員來完成每項工作。因此,如果沒有工人從事各項工作,我們希望使用Rabbitmq安排工作並設置每個工作信息ttl = 0以獲得通知。但是我們也希望Rabbitmq在工作節點崩潰時處理作業重新安排。但是,如果ttl設置爲0,Rabbitmq將在工作人員崩潰或網絡故障時放下作業消息。

我知道我們可以使用DLX來處理死信息,但是構建一個模塊來處理這些異常是很困難的,因爲我必須爲它提供高可用性。最重要的是,我無法區分調度失敗和重新安排法邑,這與處理非常不同!

你們有其他想法嗎?

回答

1

RabbitMQ無法明確地知道是否有可用的工人,即消費者。它知道有多少消費者在消費的隊列,或連接等,如果你有5名工人,他們將在一個循環的方式獲取消息,described in the tutorial. 對於這部分

也是我們希望的RabbitMQ處理工作重新安排當工作節點 崩潰

根本不使用自動ACK,而做手工ACK一旦作業完成(在上述教程實際描述)。如果工人死亡,則該消息未被確認,並且被「重新排隊」。

最重要的是,我不能從調度失敗和重新安排患者外周淋巴細胞,這是非常不同的處理區別!

現在這有點複雜了,取決於您的用例和/或您希望如何處理這些類型的故障。你可能根本沒有確認,殺死消費者,但如果消息不好,下一位消費者會得到它,並且做同樣的事情,然後它將永遠持續下去。您也可以轉發此消息(也許添加一些額外的信息),但問題是如何處理它(可能記錄它,這就是它?)等。

+0

感謝您的回覆。但你沒有得到我的問題。如果沒有可用的工作人員,我需要讓消息過期。但是如果我將消息TTL設置爲0,則代理不會重新計劃消息,因爲它會確認重新計劃消息已過期。 –

+0

@JinMa在這種情況下,你提到的DLX,根據我的經驗,這不是真的那麼挑剔:) – cantSleepNow

+0

是的,我可以使用DLX和DB來完成我的工作。但我只想要一個更簡單的方法 –

相關問題