Dot-Net

如何在 RabbitMQ 中設置重試次數?

  • April 18, 2014

我正在使用 RabbitMQ,並且我有一個包含電子郵件消息的隊列。我的消費者服務使消息出隊並嘗試發送它們。如果出於任何原因,我的消費者無法發送消息,我想將消息重新排隊以再次發送。我意識到我可以做一個 basicNack 並將 requeue 標誌設置為 true,但是,我不想無限期地重新排隊消息(例如,如果我們的電子郵件系統出現故障,我不想不斷地重新排隊未發送的消息)。我想定義一個有限的次數,我可以將消息重新排隊以再次發送。但是,當我將其出列並發送 nack 時,我無法在電子郵件對像上設置欄位。隊列中的消息上不存在更新的欄位。還有其他方法可以解決這個問題嗎?提前致謝。

RabbitMQ(以及 AMQP 協議)中沒有像重試嘗試這樣的功能。

實施重試嘗試限制行為的可能解決方案:

  1. 如果之前沒有重新傳遞消息,則重新傳遞消息(檢查方法redelivered上的參數basic.deliver- 你的庫應該有一些介面)並丟棄它,然後在死信交換中擷取,然後以某種方式處理。
  2. 每次無法處理消息時再次發布它,但設置或增加/減少標題欄位,例如x-redelivered-count(您可以選擇任何您喜歡的名稱)。要在這種情況下控制重新傳遞,您必須檢查您設置的欄位是否達到某個限制(頂部或底部 - 0 是我的選擇,ttl在 tcp/ip 的 ip 標頭中的 a-la)。
  3. 將消息唯一鍵(例如 uuid,但您必須在發布消息時手動設置)儲存在 Redis、memcache 或其他儲存中,甚至在 mysql 中與重新傳遞計數一起儲存,然後在每次重新傳遞時遞增/遞減此值,直到達到限制.
  4. (對於真正的極客)編寫將實現您想要的此類行為的外掛。

#3的優點是重新傳遞的消息保留在隊列頭中。如果您排長隊或消息順序對您很重要,這一點很重要(請注意,重新投遞會破壞嚴格的消息順序,有關詳細資訊,請參閱官方文件或有關 SO 的此問題)。

PS:

這個主題有類似的答案,但在 php.ini 中。看看它,也許它對你有一點幫助(從*“有多種技術來處理循環重新傳遞問題”*這句話開始閱讀它。

引用自:https://stackoverflow.com/questions/23158310