閱讀145 返回首頁    go 魔獸


消息重試__最佳實踐_消息隊列 MQ-阿裏雲

本文檔主要介紹 MQ 消費者的消費邏輯失敗時,通過設置返回狀態可達到消息重試的結果。

MQ 消息重試隻針對集群消費方式生效;廣播方式不提供失敗重試特性,即消費失敗後,失敗消息不再重試,繼續消費新的消息。

重試次數

MQ 默認允許每條消息最多重試 16 次,每次重試的間隔時間如下:

第幾次重試 每次重試間隔時間 第幾次重試 每次重試間隔時間
1 10 秒 9 7 分鍾
2 30 秒 10 8 分鍾
3 1 分鍾 11 9 分鍾
4 2 分鍾 12 10 分鍾
5 3 分鍾 13 20 分鍾
6 4 分鍾 14 30 分鍾
7 5 分鍾 15 1 小時
8 6 分鍾 16 2 小時

如果消息重試16次後仍然失敗,消息將不再投遞。如果嚴格按照上述重試時間間隔計算,某條消息在一直消費失敗的前提下,將會在接下來的4小時46分鍾之內進行16次重試,超過這個時間範圍消息將不再重試投遞。

配置方式

消費失敗後,重試配置方式

集群消費方式下,消息消費失敗後期望消息重試,需要在消息監聽器接口的實現中明確進行配置(三種方式任選一種):

  • 返回 Action.ReconsumeLater (推薦)
  • 返回 Null
  • 拋出異常

代碼示例如下:

  1. public class MessageListenerImpl implements MessageListener {
  2. @Override
  3. public Action consume(Message message, ConsumeContext context) {
  4. //方法3:消息處理邏輯拋出異常,消息將重試
  5. doConsumeMessage(message);
  6. //方式1:返回 Action.ReconsumeLater, 消息將重試
  7. return Action.ReconsumeLater;
  8. //方式2:返回 null, 消息將重試
  9. return null;
  10. //方式3:直接拋出異常 , 消息將重試
  11. throw new RuntimeException("Consumer Message exceotion");
  12. }
  13. }

消費失敗後,不重試配置方式

集群消費方式下,消息失敗後期望消息不重試,需要捕獲消費邏輯中可能拋出的異常,最終返回 Action.CommitMessage,此後這條消息將不會再重試。代碼示例如下:

  1. public class MessageListenerImpl implements MessageListener {
  2. @Override
  3. public Action consume(Message message, ConsumeContext context) {
  4. try {
  5. doConsumeMessage(message);
  6. } catch (Throwable e) {
  7. //捕獲消費邏輯中的所有異常 , 並返回 Action.CommitMessage;
  8. return Action.CommitMessage;
  9. }
  10. //消息處理正常 , 直接返回 Action.CommitMessage;
  11. return Action.CommitMessage;
  12. }
  13. }

自定義消息最大重試次數

自定義 MQ 客戶端日誌配置,請升級 TCP Java SDK 版本到1.2.2及以上。

MQ 允許 Consumer 啟動的時候設置最大重試次數,重試時間間隔將按照如下策略:

  • 最大重試次數小於等於16次,則重試時間間隔同上表描述。
  • 最大重試次數大於16次,超過16次的重試時間間隔均為每次2小時。

配置方式如下:

  1. Properties properties = new Properties();
  2. //配置對應 Consumer ID 的最大消息重試次數為20 次
  3. properties.put(PropertyKeyConst.MaxReconsumeTimes,20);
  4. Consumer consumer =ONSFactory.createConsumer(properties);

注意:

  • 消息最大重試次數的設置對相同 Consumer ID 下的所有 Consumer 實例有效。
  • 如果隻對配置了相同 Consumer ID 的兩個 Consumer 實例中的其中一個設置了 MaxReconsumeTimes,那麼該配置對兩個 Consumer 實例均生效。
  • 配置采用覆蓋的方式生效,即最後啟動的 Consumer 實例會覆蓋之前的啟動實例的配置。

獲取消息重試次數

消費者收到消息後,可按照如下方式獲取消息的重試次數:

  1. public class MessageListenerImpl implements MessageListener {
  2. @Override
  3. public Action consume(Message message, ConsumeContext context) {
  4. //獲取消息的重試次數
  5. System.out.println(message.getReconsumeTimes());
  6. return Action.CommitMessage;
  7. }
  8. }

最後更新:2016-11-23 16:04:17

  上一篇:go 刪除授權__資源授權接口_Open API_消息隊列 MQ-阿裏雲
  下一篇:go 訂閱關係一致__最佳實踐_消息隊列 MQ-阿裏雲