為了解決消息丟失問題,我們引入了一些重發機制,但也帶來的另外一個問題:消息重復,我們來看下都有哪些情況會導致消息重復:
消息發送超時,處於不確定狀態,導致重試發送消息,有可能之前的消息已經發送成功,會出現消息重復的情況。解決的思路是,每個消息生成一個消息id,如果發送的消息Broker已經存在了,則丟棄。這種解決辦法需要維護一個已經接收的消息的message id list。
消息在Broker中只有一份,但是consumer重啟前,未及時更新offset,導致consumer重啟之后重復消費消息。
上游業務給每個message 分配一個message ID,下游業務在接收到message之后,執行業務並且保存message ID,而且要講兩部分放到同一個事務中,保證業務執行成功,message ID肯定保存,業務執行失敗,message ID肯定不會保存下來,利用db中存儲的message id來做冪等。我們可以重新封裝producer client和consumer client,將這部分message ID分配和判重的邏輯封裝到client lib里面。