<轉(zhuǎn)載>騰訊云分布式高可靠消息隊列CMQ架構(gòu)

針對金融、交易、訂單等對可靠性、可用性有較高要求的業(yè)務(wù)場景,本文分享如何通過CMQ消息隊列實(shí)現(xiàn)高可用架構(gòu)

作者:張浩

出處:騰云閣文章

--------------------------------------------------------


在分布式大行其道的今天,我們在系統(tǒng)內(nèi)部、平臺之間廣泛運(yùn)用消息中間件進(jìn)行數(shù)據(jù)交換及解耦。CMQ是騰訊云內(nèi)部自研基于的高可靠、強(qiáng)一致、可擴(kuò)展分布式消息隊列,在騰訊內(nèi)部包括微信手機(jī)QQ業(yè)務(wù)紅包、騰訊話費(fèi)充值、廣告訂單等都有廣泛使用。目前已上線騰訊云對外開放,本文對騰訊云CMQ核心技術(shù)原理進(jìn)行分享介紹。

CMQ消息隊列主要適用于金融、交易、訂單等對可靠性、可用性有較高要求的業(yè)務(wù)場景。

以騰訊充值系統(tǒng)為例,該充值系統(tǒng)通過CMQ 對交易模塊、發(fā)貨部分、結(jié)算系統(tǒng)進(jìn)行異步解耦、削峰填谷,一方面大大降低了模塊間耦合度,另一方面減輕了大量突發(fā)請求對后端系統(tǒng)的沖擊。在月初充值該系統(tǒng)一天經(jīng)過CMQ轉(zhuǎn)發(fā)的消息超過十億條,每秒峰值超過10w,最高時有數(shù)億條消息通過CMQ的堆積能力緩沖了對后端消費(fèi)模塊的壓力。架構(gòu)如圖1:


圖1-某充值系統(tǒng)結(jié)構(gòu)

圖中騰訊云消息隊列CMQ整體結(jié)構(gòu)如圖2所示,本文重點(diǎn)介紹后端broker set實(shí)現(xiàn)原理。通常情況下一個set由3個節(jié)點(diǎn)組成,通過多副本保證消息的可靠性、多節(jié)點(diǎn)提高系統(tǒng)可用性。當(dāng)然,可以根據(jù)業(yè)務(wù)的實(shí)際需求通過增加set內(nèi)節(jié)點(diǎn)個數(shù)來進(jìn)一步提高可靠性和可用性,


圖2-CMQ整體架構(gòu)圖

CMQ set 模塊內(nèi)部結(jié)構(gòu)如圖3所示。


圖3-brokerset 內(nèi)部結(jié)構(gòu)圖

下面分別中數(shù)據(jù)高可靠、強(qiáng)一致,系統(tǒng)可用性,可擴(kuò)展、消息全路徑追蹤方面分別介紹。

在可靠性保證方面主要包括以下三方面:生產(chǎn)可靠、存儲(堆積)可靠、消費(fèi)可靠:

生產(chǎn)可靠

如圖3所示,客戶端生產(chǎn)的消息在set 中超過半數(shù)的broker 刷盤成功后會返回確認(rèn)消息告知生產(chǎn)消息成功。如果在一定時間之內(nèi)客戶端沒有收到確認(rèn)信息需要重試來確保消息發(fā)送成功。

可靠生產(chǎn)帶來的一個問題就是消息的重復(fù),在網(wǎng)絡(luò)異常等情況下很可能CMQ broker已經(jīng)存儲消息成功只是確認(rèn)包在網(wǎng)絡(luò)上丟失了,這樣客戶端重試生產(chǎn)后,在broker上存在兩條重復(fù)的消息。考慮到消息去重開銷較大,目前消息的冪等性需要業(yè)務(wù)邏輯來保證。

存儲可靠

CMQ SET中一個節(jié)點(diǎn)為leader 其他節(jié)點(diǎn)為follower,leader 負(fù)責(zé)所有消息的生產(chǎn)消費(fèi)。當(dāng)生產(chǎn)消息到達(dá)leader 節(jié)點(diǎn)后,通過raft 一致性模塊將請求順序?qū)憆aft log 并同步刷盤,同時將構(gòu)造好的raft log 按順序通過網(wǎng)絡(luò)發(fā)送到其他follower節(jié)點(diǎn),follower節(jié)點(diǎn)同步刷盤并返回成功。當(dāng)leader 收到過半數(shù)的節(jié)點(diǎn)同步成功信息后將此條請求提交到mq 處理狀態(tài)機(jī),由mq 狀態(tài)機(jī)將請求應(yīng)用到相應(yīng)queue。大致邏輯圖4所示。

圖4-數(shù)據(jù)存儲原理示意圖

由此可見,對于返回客戶端成功的消息至少是分別在兩個節(jié)點(diǎn)磁盤上存儲成功的,這就將磁盤故障引起的數(shù)據(jù)丟失大大降低。另外數(shù)據(jù)在磁盤上存儲時會將檢驗(yàn)結(jié)果一同記下來,消費(fèi)者在消費(fèi)數(shù)據(jù)之前CMQ broker 會進(jìn)行比較,確保消息是完整有效的。

消費(fèi)可靠

消費(fèi)者拉取消息時會指定當(dāng)前消息的隱藏時間,在隱藏時間內(nèi)消費(fèi)者比較顯式的對消息進(jìn)行確認(rèn)刪除,如果超過隱藏時間沒有主動刪除,此條消息將重新對外可見,可以繼續(xù)消費(fèi)。

顯式確認(rèn)刪除消息是為了防止消息在投遞、處理過程中異常而導(dǎo)致的消息丟失。

對于消息的確認(rèn)信息 CMQ broker的處理邏輯和生產(chǎn)消息過程類似,也是一個寫入的過程,不同的是此時寫入的數(shù)據(jù)的內(nèi)容是msgid 和消息狀態(tài)。

強(qiáng)一致實(shí)現(xiàn)

假如一個set中有3個節(jié)點(diǎn)(A, B, C),A為leader,B C 是follower。如上圖所示,對于返回客戶端成功的請求數(shù)據(jù)在CMQ 中至少在兩個節(jié)點(diǎn)上存在,假設(shè)為A B,此時如果leader A故障,B C 兩個follower 會自動選舉出一個新leader,CMQ 使用的raft 算法可以保證這個leader 一定是擁有最全量log 信息中的一個,在此必定是B。此時B繼續(xù)對外服務(wù),B 和A 擁有相同的已經(jīng)返回確認(rèn)給用戶的全量數(shù)據(jù)視圖,數(shù)據(jù)是強(qiáng)一致的。

對于A 和 B C 所在的網(wǎng)絡(luò)發(fā)生分區(qū)的情況(如圖5),由于leader A得不到set 中過半節(jié)點(diǎn)的回復(fù)所以不能處理請求,B C在選舉超時后會選舉出一個新的leader ,CMQ的接入層會自動進(jìn)行切換。Raft 算法保證新leader 同樣具有完成的數(shù)據(jù)視圖。


可用性保證

如上文所述,master 負(fù)責(zé)所有消息的生產(chǎn)消費(fèi),當(dāng)master 故障時SET中其他follower節(jié)點(diǎn)會自動選舉出一個新leader,客戶端請求會自動重定向到leader節(jié)點(diǎn),RTO和配置的選舉超時時間有關(guān),目前是在5s左右。大致過程如上圖6所示。

CMQ單個set 在CAP理論中優(yōu)先保證了CP,當(dāng)SET中過半數(shù)節(jié)點(diǎn)都正常工作時,才能進(jìn)行消息的生產(chǎn)消費(fèi)。對于SET多個節(jié)點(diǎn)同時故障的不可用情況,CMQ強(qiáng)大的監(jiān)控調(diào)度能力能夠快速對queue進(jìn)行調(diào)度遷移恢復(fù)服務(wù),將不可用時間降到最低。


橫向擴(kuò)展,無限堆積

上文中SET的概念對用戶來說是透明無感知的,CMQ controller server 根據(jù)set的負(fù)載情況實(shí)時對queue進(jìn)行調(diào)度搬遷。如果某個queue的請求量超過當(dāng)前set的服務(wù)閾值,controller server 可以將queue 路由分布到多個set 上來提高并發(fā)量,對于需要海量堆積的服務(wù)來說可以通過路由調(diào)度來提升堆積上限,理論上可以達(dá)到無限堆積。

目前CMQ只能保證特定情況下消息的嚴(yán)格有序,例如需要保證單個生產(chǎn)進(jìn)程、單個消費(fèi)進(jìn)程,或者queue的消費(fèi)窗口設(shè)定為1等條件。

全路徑消息trace

CMQ系統(tǒng)中,一條消息的完整路徑包含生產(chǎn)者、broker、消費(fèi)者三個角色,每個角色處理消息的過程中都會在trace 路徑中增加相關(guān)的信息,將這些信息匯聚即可獲取任意一條消息的狀態(tài)和當(dāng)前經(jīng)過的完整路徑,從而為生產(chǎn)環(huán)境中的問題排查提供強(qiáng)有力的數(shù)據(jù)支持。大大降低了業(yè)務(wù)定位問題的難度。

小結(jié)

CMQ是基于raft 算法來保證數(shù)據(jù)高可靠、強(qiáng)一致的分布式消息隊列,主要服務(wù)于訂單、交易類業(yè)務(wù)場景。消息的冪等性需業(yè)務(wù)側(cè)來保證,在特定情況下可以保證消息嚴(yán)格有序。

對于更側(cè)重高性能、高吞吐量業(yè)務(wù)需求,騰訊云由另外一個消息引擎來提供服務(wù),在協(xié)議上同時兼容kafka,很好的滿足了大數(shù)據(jù)場景,具體原理請留意后續(xù)文章介紹。



------------------------------------------

獲取更多云計算技術(shù)干貨,可請前往?騰訊云技術(shù)社區(qū)

我也會持續(xù)同步更新~

微信公眾號:騰訊云技術(shù)社區(qū)( QcloudCommunity)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,107評論 2 375

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

  • 背景介紹 Kafka簡介 Kafka是一種分布式的,基于發(fā)布/訂閱的消息系統(tǒng)。主要設(shè)計目標(biāo)如下: 以時間復(fù)雜度為O...
    高廣超閱讀 12,863評論 8 167
  • 可進(jìn)入我的博客查看原文。 Raft 算法是可以用來替代 Paxos 算法的分布式一致性算法,而且 raft 算法比...
    Jeffbond閱讀 13,387評論 4 91
  • kafka數(shù)據(jù)可靠性深度解讀 Kafka起初是由LinkedIn公司開發(fā)的一個分布式的消息系統(tǒng),后成為Apache...
    it_zzy閱讀 2,021評論 2 20
  • 本周有兩個點(diǎn)需要總結(jié):一個是錄音《思考快與慢》這本書的小感想,一個是健身這件事。 首先說錄音這件事,7月26號開始...
    小張張大皮皮閱讀 362評論 0 0
  • 那幾天我過的很不好。 分開后他走的義無反顧,而我總以為我們只是拌嘴吵鬧明天早上他依舊會問我早安。習(xí)慣他融入自己的生...
    久鰻閱讀 174評論 0 0