關(guān)于RocketMQ順序消息

RocketMQ是一款 分布式、隊(duì)列模型的消息中間件宪肖,由阿里巴巴團(tuán)隊(duì)研發(fā)表制,借鑒參考了JMS規(guī)范的MQ實(shí)現(xiàn),更參考了優(yōu)秀的開源消息中間件KAFKA控乾,并結(jié)合阿里實(shí)際業(yè)務(wù)需求么介,在天貓雙十一的場景,實(shí)現(xiàn)業(yè)務(wù)消峰蜕衡、分布式事物的優(yōu)秀框架壤短。

其具有以下特點(diǎn):

1.能夠保證嚴(yán)格的消息順序

2.提供豐富的消息拉取模式

3.高效的訂閱者水平擴(kuò)展能力

4.實(shí)時(shí)的消息訂閱機(jī)制

5.億級消息堆積能力

RocketMQ的順序消息需要滿足2點(diǎn):

1.Producer端保證發(fā)送消息有序,且發(fā)送到同一個(gè)隊(duì)列。

2.consumer端保證消費(fèi)同一個(gè)隊(duì)列久脯。

如何在集群消費(fèi)時(shí)保證消費(fèi)的有序呢纳胧?

1.ConsumeMessageOrderlyService類的start()方法,如果是集群消費(fèi)帘撰,則啟動(dòng)定時(shí)任務(wù)跑慕,定時(shí)向broker發(fā)送批量鎖住當(dāng)前正在消費(fèi)的隊(duì)列集合的消息,具體是consumer端拿到正在消費(fèi)的隊(duì)列集合摧找,發(fā)送鎖住隊(duì)列的消息至broker核行,broker端返回鎖住成功的隊(duì)列集合。consumer收到后蹬耘,設(shè)置是否鎖住標(biāo)志位芝雪。

這里注意2個(gè)變量:

consumer端的RebalanceImpl里的ConcurrentHashMap

processQueueTable,是否鎖住設(shè)置在ProcessQueue里综苔。

broker端的RebalanceLockManager里的ConcurrentHashMap mqLockTable惩系,這里維護(hù)著全局隊(duì)列鎖。

2.ConsumeMessageOrderlyService.ConsumeRequest的run方法是消費(fèi)消息如筛,這里還有個(gè)MessageQueueLock messageQueueLock蛆挫,維護(hù)當(dāng)前consumer端的本地隊(duì)列鎖。保證當(dāng)前只有一個(gè)線程能夠進(jìn)行消費(fèi)妙黍。

3.拉到消息存入ProcessQueue悴侵,然后判斷,本地是否獲得鎖拭嫁,全局隊(duì)列是否被鎖住可免,然后從ProcessQueue里取出消息,用MessageListenerOrderly進(jìn)行消費(fèi)做粤。拉到消息后調(diào)用ProcessQueue.putMessage(final List msgs)存入浇借,具體是存入TreeMap msgTreeMap。然后是調(diào)用ProcessQueue.takeMessags(final

int batchSize)消費(fèi)怕品,具體是把msgTreeMap里消費(fèi)過的消息妇垢,轉(zhuǎn)移到TreeMap msgTreeMapTemp。

4.本地消費(fèi)的事務(wù)控制肉康,ConsumeOrderlyStatus.SUCCESS(提交)闯估,ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT(掛起一會再消費(fèi)),在此之前還有一個(gè)變量ConsumeOrderlyContext context的setAutoCommit()是否自動(dòng)提交吼和。

當(dāng)SUSPEND_CURRENT_QUEUE_A_MOMENT時(shí)涨薪,autoCommit設(shè)置為true或者false沒有區(qū)別,本質(zhì)跟消費(fèi)相反炫乓,把消息從msgTreeMapTemp轉(zhuǎn)移回msgTreeMap刚夺,等待下次消費(fèi)献丑。

當(dāng)SUCCESS時(shí),autoCommit設(shè)置為true時(shí)比設(shè)置為false多做了2個(gè)動(dòng)作侠姑,consumeRequest.getProcessQueue().commit()和this.defaultMQPushConsumerImpl.getOffsetStore().updateOffset(consumeRequest.getMessageQueue(),commitOffset, false);

ProcessQueue.commit():本質(zhì)是刪除msgTreeMapTemp里的消息创橄,msgTreeMapTemp里的消息在上面消費(fèi)時(shí)從msgTreeMap轉(zhuǎn)移過來的。

this.defaultMQPushConsumerImpl.getOffsetStore().updateOffset():本質(zhì)是把拉消息的偏移量更新到本地內(nèi)存中莽红,然后定時(shí)更新到broker妥畏。

那么少了這2個(gè)動(dòng)作會怎么樣呢,隨著消息的消費(fèi)進(jìn)行船老,msgTreeMapTemp里的消息堆積越來越多咖熟,消費(fèi)消息的偏移量一直沒有更新到broker導(dǎo)致consumer每次重新啟動(dòng)后都要從頭開始重復(fù)消費(fèi)圃酵。就算更新了offset到broker柳畔,那么msgTreeMapTemp里的消息堆積呢?不知道這算不算bug所以郭赐,還是把a(bǔ)utoCommit設(shè)置為true吧薪韩。

最后要感謝這個(gè)優(yōu)秀的平臺,可以讓我們相互交流捌锭,如果想進(jìn)一步學(xué)習(xí)交流俘陷,可以加群460570824,希望大家可以一起學(xué)習(xí)進(jìn)步观谦!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拉盾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子豁状,更是在濱河造成了極大的恐慌捉偏,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泻红,死亡現(xiàn)場離奇詭異夭禽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)谊路,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門讹躯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缠劝,你說我怎么就攤上這事潮梯。” “怎么了惨恭?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵酷麦,是天一觀的道長。 經(jīng)常有香客問我喉恋,道長沃饶,這世上最難降的妖魔是什么母廷? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮糊肤,結(jié)果婚禮上琴昆,老公的妹妹穿的比我還像新娘。我一直安慰自己馆揉,他們只是感情好业舍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著升酣,像睡著了一般舷暮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上噩茄,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天下面,我揣著相機(jī)與錄音,去河邊找鬼绩聘。 笑死沥割,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凿菩。 我是一名探鬼主播机杜,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衅谷!你這毒婦竟也來了椒拗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤获黔,失蹤者是張志新(化名)和其女友劉穎蚀苛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肢执,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枉阵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了预茄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兴溜。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耻陕,靈堂內(nèi)的尸體忽然破棺而出拙徽,到底是詐尸還是另有隱情,我是刑警寧澤诗宣,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布膘怕,位于F島的核電站,受9級特大地震影響召庞,放射性物質(zhì)發(fā)生泄漏岛心。R本人自食惡果不足惜来破,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忘古。 院中可真熱鬧徘禁,春花似錦、人聲如沸髓堪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽干旁。三九已至驶沼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間争群,已是汗流浹背回怜。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祭阀,地道東北人鹉戚。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓鲜戒,卻偏偏與公主長得像专控,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子遏餐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容