阿里云消息中間件(MQ)探秘

內(nèi)容來源:2017年6月4日,阿里巴巴中間件技術(shù)部消息中間件技術(shù)專家周禮(不銘)在“企業(yè)互聯(lián)網(wǎng)架構(gòu)優(yōu)化升級(jí)之路”進(jìn)行《阿里云消息中間件(MQ)原理及實(shí)踐》演講分享柬赐。IT 大咖說(ID:itdakashuo)作為獨(dú)家視頻合作方霸奕,經(jīng)主辦方和講者審閱授權(quán)發(fā)布依溯。

閱讀字?jǐn)?shù):2513?| 5分鐘閱讀

獲取嘉賓演講視頻及PPT趣效,請(qǐng)點(diǎn)擊:http://t.cn/RDVY4JN

摘要

阿里巴巴中間技術(shù)專家不銘從功能特性普碎、技術(shù)架構(gòu)、最佳實(shí)踐丑蛤、案例分析四個(gè)方面進(jìn)行了《Aliware-MQ消息隊(duì)列》的分享。

功能特性

Aliware-MQ是阿里云提供的企業(yè)級(jí)互聯(lián)網(wǎng)架構(gòu)的核心產(chǎn)品撕阎,基于高可用分布式集群技術(shù)受裹,支持海量高并發(fā)和萬億級(jí)消息流轉(zhuǎn),支持海量的消息堆積虏束,支持高可靠/高可用方案棉饶,提供了運(yùn)維、監(jiān)控等一系列完整的配套服務(wù)镇匀。

如上圖所示照藻,從消息的維度來看分為普通消息、順序消息汗侵、定時(shí)消息和事務(wù)消息等四種消息,無論是發(fā)送哪種消息客戶端都支持熔斷機(jī)制幸缕,即如果發(fā)現(xiàn)發(fā)送目標(biāo)節(jié)點(diǎn)有性能問題群发,客戶端會(huì)自動(dòng)進(jìn)行熔斷,把有問題的節(jié)點(diǎn)排出去发乔,保證消息發(fā)往可靠性最高的機(jī)器熟妓。管理方面已經(jīng)支持消息的查詢、消息回溯栏尚、消息全鏈路軌跡和監(jiān)控報(bào)警機(jī)制起愈。性能上MQ已經(jīng)達(dá)到了百億級(jí)的堆積能力,毫秒級(jí)的投遞延遲译仗,支持萬級(jí)節(jié)點(diǎn)高并發(fā)抬虽,集群水平熱擴(kuò)縮。消息消費(fèi)方面纵菌,支持失敗后的消息重投機(jī)制阐污,失敗的消息會(huì)重新投遞到隊(duì)列中去,現(xiàn)在最多支持16次重投产艾。

上圖是Aliware-MQ的功能架構(gòu)疤剑。左邊是控制臺(tái)的管理,可以在上面做發(fā)布訂閱管理闷堡。右邊目前的接入方式是SDK支持TCP協(xié)議隘膘,同時(shí)也支持HTTP接口,以及面向手機(jī)終端的MQTT協(xié)議杠览。

OpenAPI是MQ提供給用戶的管控方式弯菊,用于實(shí)現(xiàn)一系列資源管理和運(yùn)維功能,用戶可以通過Open API查詢所需要的任何東西踱阿。

上圖中是我們今年推出的一個(gè)MQ移動(dòng)物聯(lián)網(wǎng)套件管钳。之前的客戶端,不管是上游還是下游收發(fā)都是用各自的服務(wù)器软舌。但是今年我們有了移動(dòng)物聯(lián)網(wǎng)套件才漆,可以直接面向終端設(shè)備。比如手機(jī)佛点、汽車等移動(dòng)設(shè)備利用移動(dòng)物聯(lián)網(wǎng)套件醇滥,通過一個(gè)網(wǎng)關(guān)就可以直接和消息系統(tǒng)打通。

技術(shù)架構(gòu)

Aliware-MQ的消息系統(tǒng)是基于隊(duì)列超营。隊(duì)列要保證數(shù)據(jù)安全鸳玩,是支持高并發(fā)和高性能讀寫的最基本元素。

如上圖所示演闭,Producer是消息發(fā)送集群不跟,下游的Consumer是消費(fèi)者集群,都依賴于MQ的SDK米碰。Broker是消息服務(wù)器窝革,所有的消息都發(fā)送到Broker上面购城;Name Server和ZK功能類似,用來做服務(wù)發(fā)現(xiàn)聊闯。Producer要從Name Server獲取到Topic在哪個(gè)節(jié)點(diǎn)上工猜,訂閱Topic時(shí)需要知道Topic從哪里取,同樣需要Name Server菱蔬。Broker上的Topic信息會(huì)定時(shí)在Name Server上注冊(cè)篷帅,Producer和Consumer在交互之前會(huì)從Name Server上獲取目標(biāo)。

圖中的master是主機(jī)拴泌,slave是備機(jī)魏身,主備之間會(huì)做數(shù)據(jù)同步,有異步和同步兩種方式蚪腐。一個(gè)master可以布多個(gè)節(jié)點(diǎn)箭昵,這個(gè)根據(jù)自己的成本來決定。如果擴(kuò)容的話回季,只要直接布一臺(tái)master即可家制,它會(huì)定時(shí)地將Topic注冊(cè)到Name Server上,發(fā)送方和訂閱方也會(huì)定時(shí)地感知這個(gè)過程泡一,整個(gè)擴(kuò)容的過程對(duì)于用戶來說大概30秒就能完成颤殴。

Aliware-MQ所有數(shù)據(jù)存儲(chǔ)在Commit Log里,它在實(shí)現(xiàn)上就相當(dāng)于一個(gè)文件夾鼻忠,每次會(huì)生成一個(gè)1G的文件涵但。不管哪個(gè)Topic寫過來的消息都會(huì)直接寫入這個(gè)文件中,這個(gè)文件寫滿后再直接寫下一個(gè)帖蔓。

針對(duì)每一個(gè)Topic矮瘟,要在業(yè)務(wù)層面對(duì)它進(jìn)行區(qū)分,所以我們做了一層索引塑娇。例如在上圖中有5個(gè)隊(duì)列澈侠,每個(gè)隊(duì)列都會(huì)生成定長(zhǎng)的索引文件,通過索引埋酬,可以找到這條消息當(dāng)前處于哪個(gè)CommitLog文件的某個(gè)具體位置中哨啃。

這樣存儲(chǔ)結(jié)構(gòu),保證了無論多少個(gè)topic奇瘦,CommitLog的寫是順序的,能較大的保證MQ的寫入性能劲弦。

Aliware-MQ的負(fù)載均衡是按照隊(duì)列維度來做的耳标,消費(fèi)的時(shí)候會(huì)把topic的隊(duì)列平均分配給消費(fèi)實(shí)例。比如有2個(gè)消費(fèi)實(shí)例邑跪,topic隊(duì)列是4個(gè)次坡,那么每個(gè)消費(fèi)實(shí)例就消費(fèi)2個(gè)呼猪;而如果共有5個(gè)隊(duì)列,那么就是是1個(gè)消費(fèi)2個(gè)砸琅,另1個(gè)消費(fèi)3個(gè)宋距。一個(gè)隊(duì)列同一時(shí)間只會(huì)被一個(gè)消費(fèi)實(shí)例消費(fèi),所以當(dāng)出現(xiàn)隊(duì)列數(shù)量小于消費(fèi)實(shí)例數(shù)量的情況時(shí)症脂,就會(huì)有消費(fèi)實(shí)例出現(xiàn)空閑谚赎,這個(gè)時(shí)候可以根據(jù)業(yè)務(wù)實(shí)際情況手動(dòng)通過工具將隊(duì)列數(shù)量調(diào)大。

消息寫進(jìn)來都是先放在Java堆里诱篷,然后再落盤壶唤。如果用戶要消費(fèi)的消息都在內(nèi)存里,那么就可以很快的讀取到棕所。但是如果用戶消息堆積比較久闸盔,消息已經(jīng)不在內(nèi)存里而是存儲(chǔ)在了磁盤中,這個(gè)時(shí)候就需要去磁盤里取數(shù)據(jù)琳省,然后加載到內(nèi)存里面讀取出來迎吵。

Aliware-MQ的刷盤策略有異步和同步兩種。異步到內(nèi)存就返回成功针贬,同步寫則一定是消息刷到磁盤中才會(huì)返回成功击费。這種刷盤方式可以根據(jù)業(yè)務(wù)的具體需求進(jìn)行配置,從寫入的性能來看坚踩,異步寫的性能肯定是會(huì)比同步的好荡灾。

最佳實(shí)踐

從發(fā)消息的角度來看,如果發(fā)送失敗瞬铸,會(huì)有補(bǔ)償機(jī)制批幌。MQ的客戶端會(huì)做三次重發(fā),一臺(tái)機(jī)器發(fā)送失敗之后會(huì)默認(rèn)往另外兩臺(tái)機(jī)器再嘗試嗓节,如果三次都失敗了才會(huì)把最終的失敗結(jié)果傳回荧缘,這個(gè)時(shí)候用戶需要自己對(duì)發(fā)送異常進(jìn)行相關(guān)處理。

有冪等要求的業(yè)務(wù)拦宣,Consumer在使用的時(shí)候需要自己做去重操作截粗,在一些場(chǎng)景下,如客戶端本地等待超時(shí)等鸵隧,是無法保證消息完全不重復(fù)的绸罗,因此用戶在進(jìn)行系統(tǒng)設(shè)計(jì)時(shí)需要考慮到這一點(diǎn)。

案例分析

Aliware-MQ目前支持的消息最大是4M豆瘫,消息越小珊蟀,性能越高。定時(shí)消息是支持消息的定時(shí)投遞外驱,可以自行設(shè)置要投遞的時(shí)間育灸,最長(zhǎng)是40天腻窒。事務(wù)消息通過兩階段的提交的方式,來解決分布式事務(wù)問題磅崭。順序消息可以采用全局順序儿子、分區(qū)順序,嚴(yán)格保證消息的順序砸喻。

Aliware-MQ的使用場(chǎng)景主要有系統(tǒng)間異步解耦柔逼、分布式事務(wù)、異構(gòu)數(shù)據(jù)復(fù)制與分發(fā)恩够、雙十一大促的削峰填谷卒落、大規(guī)模機(jī)器的Cache同步、日志服務(wù)和IM實(shí)時(shí)通信以及實(shí)時(shí)計(jì)算分析蜂桶。

MQ順序消息分為全局有序和隊(duì)列有序儡毕。全局有序是從指所有消息發(fā)出開始,下游的接收方都是按照順序接收扑媚;隊(duì)列有序則是將消息進(jìn)行區(qū)塊分區(qū)腰湾,同一個(gè)分區(qū)內(nèi)的消息按照先入先出的順序進(jìn)行順序消費(fèi),保證一個(gè)隊(duì)列只會(huì)被一個(gè)進(jìn)程消費(fèi)疆股。

當(dāng)一個(gè)交易系統(tǒng)下單之后费坊,會(huì)發(fā)一條消息到MQ,購物車接收消息把購物車?yán)锏臓顟B(tài)清空旬痹。如果這時(shí)交易消息發(fā)送失敗附井,購物車就無法清空,對(duì)于數(shù)據(jù)來說這就是一個(gè)臟數(shù)據(jù)两残。面對(duì)這種情況我們有事務(wù)消息可以解決這個(gè)問題永毅,在交易開始時(shí)先發(fā)送一條半事務(wù)消息,然后交易系統(tǒng)開始下單人弓,所有事情做完之后再提交半事務(wù)沼死,這時(shí)只有主動(dòng)提交成功,消息隊(duì)列才會(huì)將這條消息實(shí)際發(fā)送給用戶崔赌。如果交易下單過程失敗意蛀,則可以主動(dòng)回滾這條消息,購物車和交易系統(tǒng)之間可以做到?jīng)]有臟數(shù)據(jù)健芭。

雙十一大促時(shí)县钥,各個(gè)分會(huì)場(chǎng)會(huì)有玲瑯滿目的商品,每件商品的價(jià)格都會(huì)實(shí)時(shí)變化慈迈。使用緩存技術(shù)也無法滿足對(duì)商品價(jià)格的訪問需求若贮,緩存服務(wù)器網(wǎng)卡跑滿。訪問較多次商品價(jià)格查詢影響會(huì)場(chǎng)頁面的打開速度。于是MQ提供了一種廣播機(jī)制兜看,本來一條消息只會(huì)被集群的一臺(tái)機(jī)器消費(fèi)。如果使用廣播模式狭瞎,那么這條消息會(huì)被集群下的所有節(jié)點(diǎn)消費(fèi)一次细移,相當(dāng)于把價(jià)格信息同步到需要的每臺(tái)機(jī)器上,可以取代緩存的作用熊锭。

實(shí)時(shí)計(jì)算功能主要是做一個(gè)消息總線弧轧,業(yè)務(wù)系統(tǒng)自動(dòng)采集數(shù)據(jù),把消息分發(fā)達(dá)下游的實(shí)時(shí)計(jì)算系統(tǒng)里碗殷,根據(jù)實(shí)時(shí)計(jì)算結(jié)果來給業(yè)務(wù)方做服務(wù)精绎。

我今天的分享就到這里,謝謝大家锌妻!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末代乃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仿粹,更是在濱河造成了極大的恐慌搁吓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吭历,死亡現(xiàn)場(chǎng)離奇詭異堕仔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)晌区,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門摩骨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朗若,你說我怎么就攤上這事恼五。” “怎么了捡偏?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵唤冈,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我银伟,道長(zhǎng)你虹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任彤避,我火速辦了婚禮傅物,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琉预。我一直安慰自己董饰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卒暂,像睡著了一般啄栓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上也祠,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天昙楚,我揣著相機(jī)與錄音,去河邊找鬼诈嘿。 笑死堪旧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奖亚。 我是一名探鬼主播淳梦,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昔字!你這毒婦竟也來了爆袍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤作郭,失蹤者是張志新(化名)和其女友劉穎螃宙,沒想到半個(gè)月后黎泣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孔厉,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棺牧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年诺擅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衙傀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片励翼。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徒坡,死狀恐怖羞酗,靈堂內(nèi)的尸體忽然破棺而出状土,到底是詐尸還是另有隱情无蜂,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布蒙谓,位于F島的核電站斥季,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏累驮。R本人自食惡果不足惜酣倾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谤专。 院中可真熱鬧躁锡,春花似錦、人聲如沸置侍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杠输,卻和暖如春赎败,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蠢甲。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工螟够, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人峡钓。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像若河,于是被迫代替她去往敵國和親能岩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理萧福,服務(wù)發(fā)現(xiàn)拉鹃,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 分布式開放消息系統(tǒng)(RocketMQ)的原理與實(shí)踐 來源:http://www.reibang.com/p/453...
    meng_philip123閱讀 12,922評(píng)論 6 104
  • metaq是阿里團(tuán)隊(duì)的消息中間件鲫忍,之前也有用過和了解過kafka膏燕,據(jù)說metaq是基于kafka的源碼改過來的,他...
    菜鳥小玄閱讀 32,894評(píng)論 0 14
  • 看著可笑的自己悟民。 是正在為錢工作嗎坝辫?苦苦掙扎?實(shí)現(xiàn)我要的艱難射亏,需要能量近忙,需要清醒的看著自己。需要奮斗智润?需要生命及舍?為...
    卡布奇諾zxb0815閱讀 208評(píng)論 0 0
  • 文|壹米 01 在翻老王手機(jī)之前,我有百分之五十的把握確定他出軌了窟绷,現(xiàn)在我有百分之百的把握锯玛。 我們結(jié)婚快十年了,認(rèn)...
    壹米閱讀 991評(píng)論 12 14