系列
介紹
rocketMq消費過程包括兩種,分別是并發消費和有序消費,每個消費方式都可以單獨拿出來進行分享,這篇文章單獨用來分析串行消費問題。
由于串行消費和并行消費的大體邏輯都是相同的,所以建議先看rocketMq - 并發消費過程文章,本章只會針對不同的地方進行說明。
為什么有序消費能夠保證消息被順序消費?
為什么有序消費能夠保證消息被順序消費?
為什么有序消費能夠保證消息被順序消費?
答案是:
? ? 1、順序消費的順序是有序保存在ProcessQueue的TreeMap對象中,key為消息的偏移量,也就是一個messageQueue拉取的消息有序放置在ProcessQueue當中
? ? 2、每次消費的時候都是按序從ProcessQueue中按順序拷貝待消費任務到臨時的TreeMap對象當中
? ? 3、消費失敗后依舊會重新消費剛剛消費失敗的那部分任務
? ? 4、每次pullRequest執行完成后都會觸發一次ConsumeRequest任務,會在原來的TreeMap對象中加入新的待消費的消息
說明:參見DefaultMQPushConsumerImpl類
說明:參見ConsumeMessageOrderlyService類
? ? 1、takeMessages操作會按照順序情況從processQueue的msgTreeMap中獲取(TreeMap是有序對象)
說明:參見ConsumeMessageOrderlyService類
? ? 1、如果保證順序消費呢,獲取待消費數據的時候按照順序進行獲取放到臨時TreeMap中并刪除全局TreeMap里面的message對象
? ? 2、消費成功后清除臨時TreeMap里面的消息
? ? 3、消費失敗后將消息對象的重試次數+1然后重新提交ConsumeRequest,如果已經超出重試次數就丟棄。再次投遞是一個延遲多少時間后消費的任務
? ? 4、和無序消費的任務相比,沒有重新發送broker的重試隊列這一步
說明:參見ConsumeMessageOrderlyService類
? ? 1、消費成功后會持久化成功消費的偏移量,本地保存消費偏移量
? ? 2、定時任務定時同步消費偏移量到broker進行保存