RabbitMQ消息重試機制與冪等性

1.默認情況下,如果消費者程序出現異常的情況下會自動實現補償機制。
 

 

2.@RabbitListener

      RabbitListener底層使用AOP攔截,如果程序沒有拋出異常會自動提交事務,如果發生異常的話,會實現自動補償機制,消息會緩存到RabbitMQ服務端進行存放,程序會一直嘗試消費這條消息,直到程序不拋出異常爲止。

 

 

3.重試機制配置:

 #rabbitmq配置
  rabbitmq:
    ####連接地址
    host: 39.108.107.163
    ####端口號
    port: 5672
    ####賬號
    username: root
    ####密碼
    password: root
    ### 地址
    virtual-host: /distributeds

    #重試機制設置
    listener:
      simple:
        retry:
          ####開啓消費者重試
          enabled: true
          ####最大重試次數
          max-attempts: 5
          ####重試間隔秒數(3s)
          initial-interval: 3000

 

 

4.如何選擇重試機制

      如果消費者獲取消息後,需要調用第三方接口,但接口暫時無法訪問-----需要重試機制(根據接口的返回結果判斷,如果結果異常(爲空)直接拋出一個異常 ,RabbitListener底層使用AOP攔截進行重試)。

      如果消費者獲取消息後,消費者程序發生異常(數據轉換異常,空指針異常等需要更新代碼解決的)-----不需要重試機制(因爲  重試還是會失敗,應該採用日誌記錄消費失敗的消息,然後進行人工補償)

 

 

5.如何解決冪等性問題

產生原因:網絡延遲傳輸中,會造成進行MQ重試中,在重試過程中,可能會造成重複消費。

解決辦法:

使用全局MessageID,解決冪等性。

 

生產者生產消息的時候加上唯一的ID,並且把該ID存放到redis中,ID作爲Key,value默認爲0,消費者獲取到消息ID後去redis中查詢,如果value爲0代表該消息沒有被消費過,消費者消費完信息後將該ID的value改爲1。

6.代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章