1.冪等性
冪等(idempotent、idempotence)是一個數學與計算機學概念,常見於抽象代數中。
在編程中一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函數,或冪等方法,是指可以使用相同參數重復執行,並能獲得相同結果的函數。這些函數不會影響系統狀態,也不用擔心重復執行會對系統造成改變。例如,“setTrue()”函數就是一個冪等函數,無論多次執行,其結果都是一樣的.更復雜的操作冪等保證是利用唯一交易號(流水號)實現.
簡單來說,冪等性就是一個數據或者一個請求,給你重復來了多次,你得確保對應的數據是不會改變的,不能出錯。
2.出現重復消費場景
(1)首先,比如rabbitmq、rocketmq、kafka,都有可能會出現消息重復消費的問題。因為這個問題通常不是由mq來保證的,而是消費方自己來保證的。
(2)舉例kafka來說明重復消費問題
kafka有一個叫做offset的概念,就是每個消息寫進去,都有一個offset代表他的序號,然后consumer消費了數據之后,每隔一段時間,會把自己消費過的消息的offset提交一下,代表我已經消費過了,下次就算重啟,kafka就會讓消費者從上次消費到的offset來繼續消費。
但是萬事總有例外,如果consumer消費了數據,還沒來得及發送自己已經消費的消息的offset就掛了,那么重啟之后就會收到重復的數據。
3.保證冪等性(重復消費)
要保證消息的冪等性,這個要結合業務的類型來進行處理。下面提供幾個思路供參考:
(1)、可在內存中維護一個set,只要從消息隊列里面獲取到一個消息,先查詢這個消息在不在set里面,如果在表示已消費過,直接丟棄;如果不在,則在消費后將其加入set當中。
(2)、如何要寫數據庫,可以拿唯一鍵先去數據庫查詢一下,如果不存在在寫,如果存在直接更新或者丟棄消息。
(3)、如果是寫redis那沒有問題,每次都是set,天然的冪等性。
(4)、讓生產者發送消息時,每條消息加一個全局的唯一id,然后消費時,將該id保存到redis里面。消費時先去redis里面查一下有么有,沒有再消費。
(5)、數據庫操作可以設置唯一鍵,防止重復數據的插入,這樣插入只會報錯而不會插入重復數據。
上一篇《如何保證消息隊列的高可用》
下一篇《如何防止數據隊列數據丟失》