系列
在rocketMq的消息體系中彤蔽,很重要的一個(gè)消息體系是延遲消息,以前需要定時(shí)去實(shí)現(xiàn)的任務(wù)現(xiàn)在有rocketMq自身幫忙解決了势决,這篇文章主要是講解清楚延遲消息的實(shí)現(xiàn)細(xì)節(jié)谍婉,延遲消息的是細(xì)節(jié)蝗岖,延遲消息的實(shí)現(xiàn)細(xì)節(jié)段磨,重要的事情說3遍帘不。
延遲消息的整個(gè)流轉(zhuǎn)過程?
????1岁歉、消息先寫入commitlog文件
? ? 2、消費(fèi)線程將數(shù)據(jù)保存以SCHEDULE_TOPIC_XXX的topic下面并且以延遲粒度作為queueId區(qū)分
????3姑蓝、定時(shí)任務(wù)掃描SCHEDULE_TOPIC_XXX下的每個(gè)Queue啟一個(gè)線程進(jìn)行消費(fèi)鹅心,到時(shí)間后寫到consumeQueue當(dāng)中。
? ? 4纺荧、參考下面目錄巴帮,SCHEDULE_TOPIC_XXX目錄下面以延遲粒度作為queue的區(qū)分
? ? 5、每個(gè)粒度的都會(huì)啟動(dòng)一個(gè)定時(shí)任務(wù)虐秋,消費(fèi)任務(wù)后隔0.1s繼續(xù)掃描
? ? 6榕茧、判斷消息是否到期了通過當(dāng)前時(shí)間點(diǎn)和延遲時(shí)間對(duì)比
? ? 7、真正的消息保存在commitLog當(dāng)中客给,SCHEDULE_TOPIC_XXX下面的消息相當(dāng)于對(duì)commitLog立面的存的消息的偏移量等做了一層包裝秩霍,consumeQueue里面的消息其實(shí)是從SCHEDULE目錄下獲取得握巢。
SCHEDULE_TOPIC_XXX消息生成
說明:參見DefaultMessageStore類
延遲消息消費(fèi)
說明:參見DefaultMessageStore類豆巨。
? ? 1压怠、根據(jù)不同的粒度啟動(dòng)掃描任務(wù)
說明:參見ScheduleMessageService類
? ? 1、根據(jù)時(shí)間戳進(jìn)行對(duì)比
說明:參見ScheduleMessageService類
? ? 1血崭、啟動(dòng)下一次任務(wù)掃描