145
魔獸
消息重試__最佳實踐_消息隊列 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
- 拋出異常
代碼示例如下:
public class MessageListenerImpl implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext context) {
//方法3:消息處理邏輯拋出異常,消息將重試
doConsumeMessage(message);
//方式1:返回 Action.ReconsumeLater, 消息將重試
return Action.ReconsumeLater;
//方式2:返回 null, 消息將重試
return null;
//方式3:直接拋出異常 , 消息將重試
throw new RuntimeException("Consumer Message exceotion");
}
}
消費失敗後,不重試配置方式
集群消費方式下,消息失敗後期望消息不重試,需要捕獲消費邏輯中可能拋出的異常,最終返回 Action.CommitMessage,此後這條消息將不會再重試。代碼示例如下:
public class MessageListenerImpl implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext context) {
try {
doConsumeMessage(message);
} catch (Throwable e) {
//捕獲消費邏輯中的所有異常 , 並返回 Action.CommitMessage;
return Action.CommitMessage;
}
//消息處理正常 , 直接返回 Action.CommitMessage;
return Action.CommitMessage;
}
}
自定義消息最大重試次數
自定義 MQ 客戶端日誌配置,請升級 TCP Java SDK 版本到1.2.2及以上。
MQ 允許 Consumer 啟動的時候設置最大重試次數,重試時間間隔將按照如下策略:
- 最大重試次數小於等於16次,則重試時間間隔同上表描述。
- 最大重試次數大於16次,超過16次的重試時間間隔均為每次2小時。
配置方式如下:
Properties properties = new Properties();
//配置對應 Consumer ID 的最大消息重試次數為20 次
properties.put(PropertyKeyConst.MaxReconsumeTimes,20);
Consumer consumer =ONSFactory.createConsumer(properties);
注意:
- 消息最大重試次數的設置對相同 Consumer ID 下的所有 Consumer 實例有效。
- 如果隻對配置了相同 Consumer ID 的兩個 Consumer 實例中的其中一個設置了 MaxReconsumeTimes,那麼該配置對兩個 Consumer 實例均生效。
- 配置采用覆蓋的方式生效,即最後啟動的 Consumer 實例會覆蓋之前的啟動實例的配置。
獲取消息重試次數
消費者收到消息後,可按照如下方式獲取消息的重試次數:
public class MessageListenerImpl implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext context) {
//獲取消息的重試次數
System.out.println(message.getReconsumeTimes());
return Action.CommitMessage;
}
}
最後更新:2016-11-23 16:04:17
上一篇:
刪除授權__資源授權接口_Open API_消息隊列 MQ-阿裏雲
下一篇:
訂閱關係一致__最佳實踐_消息隊列 MQ-阿裏雲
ECS Windows係統抓包工具Wireshark的安裝使用__網絡連接問題_網絡問題_Windows操作運維問題_雲服務器 ECS-阿裏雲
簽名機製__調用方式_API 參考_雲服務器 ECS-阿裏雲
查詢API授權記錄__授權相關接口_API_API 網關-阿裏雲
步驟 4:格式化和掛載數據盤__快速入門(Linux)_雲服務器 ECS-阿裏雲
1.6 搭建博客類網站__ECS快速開始_雲服務器ECS 體驗_體驗館-阿裏雲
.hk 域名持有者變更(過戶)操作說明__域名持有者信息修改_管理操作_域名-阿裏雲
C-SDK使用(其它)__SDK使用參考_設備端接入手冊_阿裏雲物聯網套件-阿裏雲
負載均衡-Listener狀態轉換__附錄_API 參考_負載均衡-阿裏雲
刪除服務__服務管理_用戶指南_容器服務-阿裏雲
購買__指南_雲數據庫 RDS 版-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲