內(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ù)精绎。
我今天的分享就到這里,謝謝大家锌妻!