關(guān)于消息中間件RocketMQ的基本概念及功能
背景
RocketMQ是阿里巴巴在2012年開發(fā)的分布式消息中間件,專為萬億級(jí)超大規(guī)模的消息處理而設(shè)計(jì),具有高吞吐量、低延遲、海量堆積、順序收發(fā)等特點(diǎn)。
2015年,RocketMQ在消息傳遞方面迎來了一批重量級(jí)功能發(fā)布,包括事務(wù)消息、SQL過濾、軌跡追蹤、定時(shí)消息、高可用多活等,以滿足阿里巴巴日益豐富的業(yè)務(wù)場(chǎng)景。同年,RocketMQ被捐贈(zèng)給Apache基金會(huì),并入選孵化器項(xiàng)目,旨在未來為更多開發(fā)者服務(wù)。
2017年從Apache基金會(huì)畢業(yè)后,RocketMQ被指定為頂級(jí)項(xiàng)目(TLP)。
架構(gòu)模型
RocketMQ基于kafka的設(shè)計(jì)使用Java重寫,其架構(gòu)模型如下圖:
- NameServer Cluster 可以對(duì)應(yīng)Kafka中的Zookeeper Cluster。
- 多個(gè)Broker Master 可以對(duì)應(yīng)Kafka中的分區(qū)承載體。
- Broker Slave 可以對(duì)應(yīng)Kafka中的replica承載體。
NameServer 名字服務(wù)器
NameServer是一個(gè)簡(jiǎn)單的 Topic 路由注冊(cè)中心,支持 Topic、Broker 的動(dòng)態(tài)注冊(cè)與發(fā)現(xiàn)。主要包括兩個(gè)功能:
- Broker管理,NameServer接受Broker集群的注冊(cè)信息并且保存下來作為路由信息的基本數(shù)據(jù)。然后提供心跳檢測(cè)機(jī)制,檢查Broker是否還存活;
- 路由信息管理,每個(gè)NameServer將保存關(guān)于 Broker 集群的整個(gè)路由信息和用于客戶端查詢的隊(duì)列信息。Producer和Consumer通過NameServer就可以知道整個(gè)Broker集群的路由信息,從而進(jìn)行消息的投遞和消費(fèi)。
NameServer通常會(huì)有多個(gè)實(shí)例部署,各實(shí)例間相互不進(jìn)行信息通訊。Broker是向每一臺(tái)NameServer注冊(cè)自己的路由信息,所以每一個(gè)NameServer實(shí)例上面都保存一份完整的路由信息。當(dāng)某個(gè)NameServer因某種原因下線了,客戶端仍然可以向其它NameServer獲取路由信息。
Broker 代理服務(wù)器
Broker主要負(fù)責(zé)消息的存儲(chǔ)、投遞和查詢以及服務(wù)高可用保證。
在 Master-Slave 架構(gòu)中,Master可以部署多個(gè),一個(gè)Master可以對(duì)應(yīng)多個(gè)Slave,但是一個(gè)Slave只能對(duì)應(yīng)一個(gè)Master。Master 與 Slave 的對(duì)應(yīng)關(guān)系通過指定相同的BrokerName,不同的BrokerId 來定義,BrokerId為0表示Master,非0表示Slave。
生產(chǎn)者
生產(chǎn)者用來構(gòu)建并傳輸消息到服務(wù)端的運(yùn)行實(shí)體。生產(chǎn)者通常被集成在業(yè)務(wù)系統(tǒng)中,將業(yè)務(wù)消息按照要求封裝成消息并發(fā)送至服務(wù)端。投遞的過程支持快速失敗和重試,并且支持以下幾個(gè)形式:
- 普通消息
- 順序消息
- 事務(wù)消息
- 延遲消息
- 批量消息
主題
主題是消息傳輸和存儲(chǔ)的頂層容器,用于標(biāo)識(shí)同一類業(yè)務(wù)邏輯的消息。 主題的作用主要如下:
- 定義數(shù)據(jù)的分類隔離: 建議將不同業(yè)務(wù)類型的數(shù)據(jù)拆分到不同的主題中管理,通過主題實(shí)現(xiàn)存儲(chǔ)的隔離性和訂閱隔離性。
- 定義數(shù)據(jù)的身份和權(quán)限:消息本身是匿名無身份的,同一分類的消息使用相同的主題來做身份識(shí)別和權(quán)限管理。
隊(duì)列
隊(duì)列是消息存儲(chǔ)和傳輸?shù)膶?shí)際容器,也是消息的最小存儲(chǔ)單元。隊(duì)列的主要作用如下:
- 存儲(chǔ)順序性:隊(duì)列天然具備順序性,即消息按照進(jìn)入隊(duì)列的順序?qū)懭氪鎯?chǔ),同一隊(duì)列間的消息天然存在順序關(guān)系,隊(duì)列頭部為最早寫入的消息,隊(duì)列尾部為最新寫入的消息。消息在隊(duì)列中的位置和消息之間的順序通過位點(diǎn)(Offset)進(jìn)行標(biāo)記管理。
消息
消息是最小數(shù)據(jù)傳輸單元。具備如下特點(diǎn):
- 消息不可變性:消息本質(zhì)上是已經(jīng)產(chǎn)生并確定的事件,一旦產(chǎn)生后,消息的內(nèi)容不會(huì)發(fā)生改變。
- 消息持久化:RocketMQ 會(huì)默認(rèn)對(duì)消息進(jìn)行持久化,保證消息的可回溯性和系統(tǒng)故障場(chǎng)景下的可恢復(fù)性。
消息標(biāo)簽
消息標(biāo)簽是RocketMQ提供的細(xì)粒度消息分類屬性,可以在主題層級(jí)之下做消息類型的細(xì)分。
消息位點(diǎn)
消息是按到達(dá)RocketMQ服務(wù)端的先后順序存儲(chǔ)在指定主題的多個(gè)隊(duì)列中,每條消息在隊(duì)列中都有一個(gè)唯一的Long類型坐標(biāo),這個(gè)坐標(biāo)被定義為消息位點(diǎn)。
消費(fèi)者
消費(fèi)者中用來接收并處理消息的運(yùn)行實(shí)體。消費(fèi)者通常被集成在業(yè)務(wù)系統(tǒng)中,從服務(wù)端獲取消息,并將消息轉(zhuǎn)化成業(yè)務(wù)可理解的信息,供業(yè)務(wù)邏輯處理。有以下幾個(gè)功能:
- 支持以推(push),拉(pull)兩種模式對(duì)消息進(jìn)行消費(fèi)。
- 支持集群方式和廣播方式的消費(fèi)。
消費(fèi)位點(diǎn)
一條消息被某個(gè)消費(fèi)者消費(fèi)完成后不會(huì)立即從隊(duì)列中刪除,RocketMQ會(huì)基于每個(gè)消費(fèi)者分組記錄消費(fèi)過的最新一條消息的位點(diǎn),即消費(fèi)位點(diǎn)。可以通過重置消費(fèi)位點(diǎn)來實(shí)現(xiàn)一些功能,比如,業(yè)務(wù)回溯,糾正處理。
消費(fèi)者分組
消費(fèi)者分組承載多個(gè)消費(fèi)行為一致的消費(fèi)者的負(fù)載均衡分組。和消費(fèi)者不同,消費(fèi)者分組并不是運(yùn)行實(shí)體,而是一個(gè)邏輯資源,通過消費(fèi)者分組初始化多個(gè)消費(fèi)者實(shí)現(xiàn)消費(fèi)性能的水平擴(kuò)展以及高可用容災(zāi)。在消費(fèi)者分組中,統(tǒng)一定義以下消費(fèi)行為:
- 訂閱關(guān)系:消費(fèi)者分組的粒度管理訂閱關(guān)系,實(shí)現(xiàn)訂閱關(guān)系的管理和追溯。
- 投遞順序性:服務(wù)端將消息投遞給消費(fèi)者消費(fèi)時(shí),支持順序投遞和并發(fā)投遞,投遞方式在消費(fèi)者分組中統(tǒng)一配置。
- 消費(fèi)重試策略: 消費(fèi)者消費(fèi)消息失敗時(shí)的重試策略,包括重試次數(shù)、死信隊(duì)列設(shè)置等。具體信息,請(qǐng)參見消費(fèi)重試。
訂閱關(guān)系
訂閱關(guān)系是RocketMQ系統(tǒng)中消費(fèi)者獲取消息、處理消息的規(guī)則和狀態(tài)配置。
由消費(fèi)者分組動(dòng)態(tài)注冊(cè)到服務(wù)端系統(tǒng),并在后續(xù)的消息傳輸中按照訂閱關(guān)系定義的過濾規(guī)則進(jìn)行消息匹配和消費(fèi)進(jìn)度維護(hù)。通過配置訂閱關(guān)系,可控制如下傳輸行為:
- 消息過濾規(guī)則:用于控制消費(fèi)者在消費(fèi)消息時(shí),選擇主題內(nèi)的哪些消息進(jìn)行消費(fèi)。
- 消費(fèi)狀態(tài):消費(fèi)者分組在服務(wù)端注冊(cè)訂閱關(guān)系后,當(dāng)消費(fèi)者離線并再次上線后,可以獲取離線前的消費(fèi)進(jìn)度并繼續(xù)消費(fèi)。
參考文章
到此這篇關(guān)于關(guān)于消息中間件RocketMQ的基本概念及功能的文章就介紹到這了,更多相關(guān)RocketMQ概念及功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA操作HDFS案例的簡(jiǎn)單實(shí)現(xiàn)
本篇文章主要介紹了JAVA操作HDFS案例的簡(jiǎn)單實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08spring boot集成shiro詳細(xì)教程(小結(jié))
這篇文章主要介紹了spring boot 集成shiro詳細(xì)教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01Idea中如何調(diào)出Run dashboard 或services窗口
這篇文章主要介紹了Idea中如何調(diào)出Run dashboard 或services窗口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Springboot注解@Value讀取配置文件參數(shù)詳解
Spring Boot提供了靈活的配置文件讀取機(jī)制,主要有兩種方式,第一種是使用@Value注解直接在類屬性上讀取application.yml文件中的配置,這種方式簡(jiǎn)單直接,但需要為每個(gè)配置項(xiàng)單獨(dú)設(shè)置屬性,第二種方式是通過@PropertySource注解讀取自定義的Properties文件2024-11-11