系列
介紹
rocketMq消費(fèi)過程包括兩種荣暮,分別是并發(fā)消費(fèi)和有序消費(fèi),每個(gè)消費(fèi)方式都可以單獨(dú)拿出來進(jìn)行分享,這篇文章單獨(dú)用來分析串行消費(fèi)問題。
由于串行消費(fèi)和并行消費(fèi)的大體邏輯都是相同的,所以建議先看rocketMq - 并發(fā)消費(fèi)過程文章齿椅,本章只會(huì)針對(duì)不同的地方進(jìn)行說明。
為什么有序消費(fèi)能夠保證消息被順序消費(fèi)筛圆?
為什么有序消費(fèi)能夠保證消息被順序消費(fèi)捏顺?
為什么有序消費(fèi)能夠保證消息被順序消費(fèi)六孵?
答案是:
? ? 1、順序消費(fèi)的順序是有序保存在ProcessQueue的TreeMap對(duì)象中幅骄,key為消息的偏移量劫窒,也就是一個(gè)messageQueue拉取的消息有序放置在ProcessQueue當(dāng)中
? ? 2、每次消費(fèi)的時(shí)候都是按序從ProcessQueue中按順序拷貝待消費(fèi)任務(wù)到臨時(shí)的TreeMap對(duì)象當(dāng)中
? ? 3拆座、消費(fèi)失敗后依舊會(huì)重新消費(fèi)剛剛消費(fèi)失敗的那部分任務(wù)
? ? 4主巍、每次pullRequest執(zhí)行完成后都會(huì)觸發(fā)一次ConsumeRequest任務(wù),會(huì)在原來的TreeMap對(duì)象中加入新的待消費(fèi)的消息
說明:參見DefaultMQPushConsumerImpl類
說明:參見ConsumeMessageOrderlyService類
? ? 1挪凑、takeMessages操作會(huì)按照順序情況從processQueue的msgTreeMap中獲让呵荨(TreeMap是有序?qū)ο螅?/p>
說明:參見ConsumeMessageOrderlyService類
? ? 1、如果保證順序消費(fèi)呢岖赋,獲取待消費(fèi)數(shù)據(jù)的時(shí)候按照順序進(jìn)行獲取放到臨時(shí)TreeMap中并刪除全局TreeMap里面的message對(duì)象
? ? 2檬果、消費(fèi)成功后清除臨時(shí)TreeMap里面的消息
? ? 3、消費(fèi)失敗后將消息對(duì)象的重試次數(shù)+1然后重新提交ConsumeRequest唐断,如果已經(jīng)超出重試次數(shù)就丟棄选脊。再次投遞是一個(gè)延遲多少時(shí)間后消費(fèi)的任務(wù)
? ? 4、和無序消費(fèi)的任務(wù)相比脸甘,沒有重新發(fā)送broker的重試隊(duì)列這一步
說明:參見ConsumeMessageOrderlyService類
? ? 1恳啥、消費(fèi)成功后會(huì)持久化成功消費(fèi)的偏移量,本地保存消費(fèi)偏移量
? ? 2丹诀、定時(shí)任務(wù)定時(shí)同步消費(fèi)偏移量到broker進(jìn)行保存