544
阿裏雲
消費冪等__最佳實踐_消息隊列 MQ-阿裏雲
本文檔主要強調 MQ 消費者在接收到消息以後根據業務上的唯一 Key 對消息做冪等處理的必要性。
消費冪等的必要性
在互聯網應用中,尤其在網絡不穩定的情況下,MQ 的消息有可能會出現重複,這個重複簡單可以概括為以下兩種情況:
- 發送時消息重複【消息 Message ID 不同】:
MQ Producer 發送消息場景下,消息已成功發送到服務端並完成持久化,此時網絡閃斷或者客戶端宕機導致服務端應答給客戶端失敗;如果此時 MQ Producer 意識到消息發送失敗並嚐試再次發送消息,MQ 消費者後續會收到兩條內容相同但是 Message ID 不同的消息。
- 投遞時消息重複【消息 Message ID 相同】;
MQ Consumer 消費消息場景下,消息已投遞到消費者並完成業務處理,當客戶端給服務端反饋應答的時候網絡閃斷,為了保證消息至少被消費一次,MQ 服務端將在網絡恢複後再次嚐試投遞之前已被處理過的消息,MQ 消費者後續會收到兩條內容相同並且 Message ID 也相同的消息。
處理建議
基於上述第一種原因,內容相同的消息 Message ID 可能會不同,真正安全的冪等處理,不建議以 Message ID 作為處理依據;最好的方式是以業務唯一標識作為冪等處理的關鍵依據,而業務的唯一標識可以通過 Key 設置到消息裏麵:
Message message = new Message();
message.setKey("ORDERID_100");
SendResult sendResult = producer.send(message);
訂閱方收到消息時可以根據消息的 key 進行冪等處理:
consumer.subscribe("ons_test", "*", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
String key = message.getKey()
// 根據業務唯一標識的 key 做冪等處理
}
});
最後更新:2016-11-23 16:04:19
上一篇:
訂閱關係一致__最佳實踐_消息隊列 MQ-阿裏雲
下一篇:
配置相關___常見問題_產品使用問題_消息隊列 MQ-阿裏雲
資源監控__用戶指南_CDN-阿裏雲
Android SDK手冊__SDK手冊_HTTPDNS-阿裏雲
按秒計費!阿裏雲服務器大升級
雲服務器遭受網絡攻擊的處理方法__故障處理_雲服務器 ECS-阿裏雲
查詢模板分析作業__預置智能模版推薦接口_API使用手冊_媒體轉碼-阿裏雲
管理對象生命周期__管理文件_開發人員指南_對象存儲 OSS-阿裏雲
ECS 數據源 (2/3):Agent 安裝__準備數據源_用戶指南_業務實時監控服務 ARMS-阿裏雲
購買安騎士、安裝安全狗被黑__用戶指南_服務器安全(安騎士)-阿裏雲
計費模式__購買實例_購買指南_雲服務器 ECS-阿裏雲
Discuz如何存儲遠程附件到OSS__ossftp_常用工具_對象存儲 OSS-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲