閱讀544 返回首頁    go 阿裏雲


消費冪等__最佳實踐_消息隊列 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 設置到消息裏麵:

  1. Message message = new Message();
  2. message.setKey("ORDERID_100");
  3. SendResult sendResult = producer.send(message);

訂閱方收到消息時可以根據消息的 key 進行冪等處理:

  1. consumer.subscribe("ons_test", "*", new MessageListener() {
  2. public Action consume(Message message, ConsumeContext context) {
  3. String key = message.getKey()
  4. // 根據業務唯一標識的 key 做冪等處理
  5. }
  6. });

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

  上一篇:go 訂閱關係一致__最佳實踐_消息隊列 MQ-阿裏雲
  下一篇:go 配置相關___常見問題_產品使用問題_消息隊列 MQ-阿裏雲