終身學(xué)習(xí)是程序員的必備能力迹辐,一群人在一起走得更遠(yuǎn)蝶防,一起學(xué)習(xí),共抗惰性明吩。今天间学,我們來(lái)重點(diǎn)了解RocketMQ的簡(jiǎn)介與演進(jìn)、架構(gòu)設(shè)計(jì)印荔、關(guān)鍵特性及應(yīng)用場(chǎng)景等內(nèi)容低葫。
本文內(nèi)容大綱:
RocketMQ的簡(jiǎn)介與演進(jìn)
RocketMQ的架構(gòu)設(shè)計(jì)
RocketMQ的關(guān)鍵特性
RocketMQ的應(yīng)用場(chǎng)景
01? ?RocketMQ的簡(jiǎn)介
RocketMQ是一個(gè)純java、分布式仍律、隊(duì)列模型的開(kāi)源消息中間件嘿悬,前身是MetaQ,是阿里研發(fā)的一個(gè)隊(duì)列模型的消息中間件水泉,后開(kāi)源給apache基金會(huì)成為了apache的頂級(jí)開(kāi)源項(xiàng)目善涨,具有高性能主到、高可靠、高實(shí)時(shí)躯概、分布式特點(diǎn)登钥。
02? RocketMQ的演進(jìn)
RocketMQ一共前后經(jīng)歷了三代演進(jìn):
1.第一代,推模式
數(shù)據(jù)存儲(chǔ)采用關(guān)系型數(shù)據(jù)庫(kù)娶靡,典型代表包括Notify牧牢、Napoli。
2.第二代姿锭,拉模式
自研的專(zhuān)有消息存儲(chǔ)塔鳍,在日志處理方面參考Kafka,典型代表MetaQ呻此。
3.第三代轮纫,以拉模式為主,兼有推模式
低延遲消息引擎RocketMQ焚鲜,在二代功能特性的基礎(chǔ)上掌唾,為電商金融領(lǐng)域添加了可靠重試、基于文件存儲(chǔ)的分布式事務(wù)等特性忿磅。使用在阿里大量的應(yīng)用上糯彬,典型如雙11場(chǎng)景,具有萬(wàn)億級(jí)消息流轉(zhuǎn)葱她。
03? RocketMQ的架構(gòu)設(shè)計(jì)
1.RocketMQ的核心組件
RocketMQ主要由NameServer撩扒、Broker、Producer以及Consumer四部分構(gòu)成吨些。
1)NameServer:主要負(fù)責(zé)對(duì)于源數(shù)據(jù)的管理搓谆,包括了對(duì)于Topic和路由信息的管理。
NameServer是一個(gè)功能齊全的服務(wù)器豪墅,其角色類(lèi)似Dubbo中的Zookeeper泉手,但NameServer與Zookeeper相比更輕量。主要是因?yàn)槊總€(gè)NameServer節(jié)點(diǎn)互相之間是獨(dú)立的但校,沒(méi)有任何信息交互螃诅。
備注:下面的消息類(lèi)型有Topic的介紹啡氢。
2) Producer
消息生產(chǎn)者状囱,負(fù)責(zé)產(chǎn)生消息,一般由業(yè)務(wù)系統(tǒng)負(fù)責(zé)產(chǎn)生消息倘是。
Producer由用戶(hù)進(jìn)行分布式部署亭枷,消息由Producer通過(guò)多種負(fù)載均衡模式發(fā)送到Broker集群,發(fā)送低延時(shí)搀崭,支持快速失敗叨粘。
3 )Broker
消息中轉(zhuǎn)角色猾编,負(fù)責(zé)存儲(chǔ)消息,轉(zhuǎn)發(fā)消息升敲。
Broker是具體提供業(yè)務(wù)的服務(wù)器答倡,單個(gè)Broker節(jié)點(diǎn)與所有的NameServer節(jié)點(diǎn)保持長(zhǎng)連接及心跳,并會(huì)定時(shí)將Topic信息注冊(cè)到NameServer驴党,順帶一提底層的通信和連接都是基于Netty實(shí)現(xiàn)的瘪撇。
Broker負(fù)責(zé)消息存儲(chǔ),以Topic為緯度支持輕量級(jí)的隊(duì)列港庄,單機(jī)可以支撐上萬(wàn)隊(duì)列規(guī)模倔既,支持消息推拉模型。
官網(wǎng)上有數(shù)據(jù)顯示:具有上億級(jí)消息堆積能力鹏氧,同時(shí)可嚴(yán)格保證消息的有序性渤涌。
4)Consumer
消息消費(fèi)者,負(fù)責(zé)消費(fèi)消息把还,一般是后臺(tái)系統(tǒng)負(fù)責(zé)異步消費(fèi)实蓬。
Consumer也由用戶(hù)部署,支持PUSH和PULL兩種消費(fèi)模式吊履,支持集群消費(fèi)和廣播消息瞳秽,提供實(shí)時(shí)的消息訂閱機(jī)制。
5)大致流程
Broker在啟動(dòng)的時(shí)候會(huì)去向NameServer注冊(cè)并且定時(shí)發(fā)送心跳率翅,Producer在啟動(dòng)的時(shí)候會(huì)到NameServer上去拉取Topic所屬的Broker具體地址练俐,然后向具體的Broker發(fā)送消息。具體如下圖:
2.RocketMQ的消息領(lǐng)域模型
主要分為Message冕臭、Topic腺晾、Queue、Offset以及Group這幾部分辜贵。
1)Topic
Topic表示消息的第一級(jí)類(lèi)型悯蝉,比如一個(gè)電商系統(tǒng)的消息可以分為:交易消息、物流消息等托慨。一條消息必須有一個(gè)Topic鼻由。
最細(xì)粒度的訂閱單位,一個(gè)Group可以訂閱多個(gè)Topic的消息厚棵。
2)Tag
Tag表示消息的第二級(jí)類(lèi)型蕉世,比如交易消息又可以分為:交易創(chuàng)建消息,交易完成消息等婆硬。RocketMQ提供2級(jí)消息分類(lèi)狠轻,方便靈活控制。
3)Group
組彬犯,一個(gè)組可以訂閱多個(gè)Topic向楼。
4)Message Queue
消息的物理管理單位查吊。一個(gè)Topic下可以有多個(gè)Queue,Queue的引入使得消息的存儲(chǔ)可以分布式集群化湖蜕,具有了水平擴(kuò)展能力逻卖。
在 RocketMQ 中,所有消息隊(duì)列都是持久化昭抒,長(zhǎng)度無(wú)限的數(shù)據(jù)結(jié)構(gòu)箭阶,所謂長(zhǎng)度無(wú)限是指隊(duì)列中的每個(gè)存儲(chǔ)單元都是定長(zhǎng),訪問(wèn)其中的存儲(chǔ)單元使用 Offset 來(lái)訪問(wèn)戈鲁,offset 為 java long 類(lèi)型仇参,64 位,理論上在 100年內(nèi)不會(huì)溢出婆殿,所以認(rèn)為是長(zhǎng)度無(wú)限诈乒。
也可以認(rèn)為 Message Queue 是一個(gè)長(zhǎng)度無(wú)限的數(shù)組,Offset 就是下標(biāo)婆芦。
04? ?RocketMQ的關(guān)鍵特性
1.消息的順序
消息的順序指的是消息消費(fèi)時(shí)怕磨,能按照發(fā)送的順序來(lái)消費(fèi)。例如:一個(gè)訂單產(chǎn)生了 3 條消息消约,分別是訂單創(chuàng)建肠鲫、訂單付款、訂單完成或粮。消費(fèi)時(shí)导饲,要按照這個(gè)順序消費(fèi)才有意義。但同時(shí)訂單之間又是可以并行消費(fèi)的氯材。
RocketMQ是通過(guò)將“相同ID的消息發(fā)送到同一個(gè)隊(duì)列渣锦,而一個(gè)隊(duì)列的消息只由一個(gè)消費(fèi)者處理“來(lái)實(shí)現(xiàn)順序消息。如下圖:
這樣對(duì)于同一個(gè)訂單的創(chuàng)建氢哮、付款和完成消息袋毙,確保按照這一順序被發(fā)送和消費(fèi)。
2.消息重復(fù)
1)消息重復(fù)的原因
消息領(lǐng)域有一個(gè)對(duì)消息投遞的QoS定義冗尤,分為:
最多一次(At most once)
至少一次(At least once)
僅一次( Exactly once)
QoS:Quality of Service听盖,服務(wù)質(zhì)量
幾乎所有的MQ產(chǎn)品都聲稱(chēng)自己做到了At least once。既然是至少一次裂七,那避免不了消息重復(fù)皆看,尤其是在分布式網(wǎng)絡(luò)環(huán)境下。比如:網(wǎng)絡(luò)原因閃斷碍讯,ACK返回失敗等等故障悬蔽,確認(rèn)信息沒(méi)有傳送到消息隊(duì)列,導(dǎo)致消息隊(duì)列不知道自己已經(jīng)消費(fèi)過(guò)該消息了捉兴,再次將該消息分發(fā)給其他的消費(fèi)者蝎困。
不同的消息隊(duì)列發(fā)送的確認(rèn)信息形式不同,例如RabbitMQ是發(fā)送一個(gè)ACK確認(rèn)消息,RocketMQ是返回一個(gè)CONSUME_SUCCESS成功標(biāo)志倍啥,kafka實(shí)際上有個(gè)offset的概念禾乘。
RocketMQ沒(méi)有內(nèi)置消息去重的解決方案,最新版本是否支持還需確認(rèn)虽缕。
2)消息去重
去重原則:利用業(yè)務(wù)端邏輯保持冪等性
冪等性:就是用戶(hù)對(duì)于同一操作發(fā)起的一次請(qǐng)求或者多次請(qǐng)求的結(jié)果是一致的始藕,不會(huì)因?yàn)槎啻吸c(diǎn)擊而產(chǎn)生了副作用,數(shù)據(jù)庫(kù)的結(jié)果都是唯一的氮趋,不可變的。
只要保持冪等性,不管來(lái)多少條重復(fù)消息养盗,最后處理的結(jié)果都一樣袱巨,需要業(yè)務(wù)端來(lái)實(shí)現(xiàn)。
去重策略:保證每條消息都有唯一編號(hào)(比如唯一流水號(hào))昵观,且保證消息處理成功與去重表的日志同時(shí)出現(xiàn)晾腔。
建立一個(gè)消息表,拿到這個(gè)消息做數(shù)據(jù)庫(kù)的insert操作啊犬。給這個(gè)消息做一個(gè)唯一主鍵(primary key)或者唯一約束灼擂,那么就算出現(xiàn)重復(fù)消費(fèi)的情況,就會(huì)導(dǎo)致主鍵沖突觉至,那么就不再處理這條消息剔应。
05? ?RocketMQ的應(yīng)用場(chǎng)景
1.削峰填谷
比如如秒殺等大型活動(dòng)時(shí)會(huì)帶來(lái)較高的流量脈沖,如果沒(méi)做相應(yīng)的保護(hù)语御,將導(dǎo)致系統(tǒng)超負(fù)荷甚至崩潰领斥。如果因限制太過(guò)導(dǎo)致請(qǐng)求大量失敗而影響用戶(hù)體驗(yàn),可以利用MQ 超高性能的消息處理能力來(lái)解決沃暗。
2.異步解耦
通過(guò)上月洛、下游業(yè)務(wù)系統(tǒng)的松耦合設(shè)計(jì),比如:交易系統(tǒng)的下游子系統(tǒng)(如積分等)出現(xiàn)不可用甚至宕機(jī)孽锥,都不會(huì)影響到核心交易系統(tǒng)的正常運(yùn)轉(zhuǎn)嚼黔。
3.順序消息
與FIFO原理類(lèi)似,提供的順序消息即保證消息的先進(jìn)先出惜辑,可以應(yīng)用于交易系統(tǒng)中的訂單創(chuàng)建唬涧、支付、退款等流程盛撑。
4.分布式事務(wù)消息
比如阿里的交易系統(tǒng)碎节、支付紅包等場(chǎng)景需要確保數(shù)據(jù)的最終一致性,需要考慮引入 MQ 的分布式事務(wù)抵卫。主要是將大事務(wù)拆分成小事務(wù)狮荔,減少系統(tǒng)間的交互胎撇,既高效又可靠。再利用MQ 的可靠傳輸與多副本技術(shù)確保消息不丟殖氏,At-Least-Once 特性來(lái)最終確保數(shù)據(jù)的最終一致性晚树。
覺(jué)得不錯(cuò)請(qǐng)點(diǎn)贊支持,歡迎留言或進(jìn)我的個(gè)人群179961551領(lǐng)取【架構(gòu)資料專(zhuān)題目合集90期】雅采、【BATJTMD大廠JAVA面試真題1000+】爵憎,本群專(zhuān)用于學(xué)習(xí)交流技術(shù)、分享面試機(jī)會(huì)婚瓜,拒絕廣告宝鼓,我也會(huì)在群內(nèi)不定期答題、探討巴刻。