您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)RocketMQ架構(gòu)原理的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
RocketMQ 架構(gòu)原理分析
RocketMQ 架構(gòu)
NameServer (名稱服務(wù)器):
提供輕量級的服務(wù)發(fā)現(xiàn)和路由。NameServer接受來自Broker群集的注冊,并提供檢測信號機(jī)制以檢查Broker是否還存在
每個NameServer記錄完整的路由信息(Broker 相關(guān) Topic 等元信息,并給 Producer 提供 Consumer 查找 Broker 信息),提供相應(yīng)的讀寫服務(wù)。
Broker(消息服務(wù)器): 消息存儲中心,接收來自 Producer 的消息并存儲, Consumer 從這里取得消息
單個Broker節(jié)點與所有的NameServer節(jié)點保持長連接及心跳,并會定時將Topic信息注冊到NameServer,(其底層通信是基于Netty實現(xiàn)的)
Broker負(fù)責(zé)消息存儲,以Topic為維度支持輕量級的隊列,單機(jī)可以支撐上萬隊列規(guī)模,支持消息推拉模型。
具有上億級消息堆積能力,同時可嚴(yán)格保證消息的有序性
Producer (生產(chǎn)者):
負(fù)責(zé)產(chǎn)生消息,生產(chǎn)者向消息服務(wù)器發(fā)送由業(yè)務(wù)應(yīng)用程序系統(tǒng)生成的消息
生產(chǎn)者支持分布式部署。分布式生產(chǎn)者通過多種負(fù)載平衡模式將消息發(fā)送到Broker集群。發(fā)送過程支持快速失敗并且延遲低
三種方式發(fā)送消息:同步、異步和單向
Consumer(消費者):
負(fù)責(zé)消費消息,消費者從消息服務(wù)器拉取信息并將其輸入用戶應(yīng)用程序
也支持“推和拉”模型中的分布式部署。
它還支持集群使用和消息廣播。它提供了實時消息訂閱機(jī)制,可以滿足大多數(shù)消費者的需求。
Broker Server
Broker Server負(fù)責(zé)消息的存儲和傳遞,消息查詢,HA高可用等,Broker Server幾個主要模塊組成:
Remoting Module(遠(yuǎn)程模塊):broker入口,處理來自客戶端的請求
Client Manager(客戶端管理):管理client(生產(chǎn)者/消費者)并維護(hù)消費者的主題訂閱
Store Service(存儲服務(wù)):提供簡單的API供給數(shù)據(jù)庫存儲或查詢消息
HA Service(高可用服務(wù)):提供master broker和slave broker之間的數(shù)據(jù)同步功能
Index Service(索引服務(wù)):將message建立索引來提供快速的查詢能力
RocketMQ 整體流程
1.啟動 NameServer,NameServer啟動后進(jìn)行端口監(jiān)聽,等待 Broker、Producer、Consumer 連上來,相當(dāng)于一個路由控制中心
2.Broker 啟動,跟所有的 Namesrv 保持長連接,定時發(fā)送心跳包
心跳包中,包含當(dāng)前 Broker 信息(IP+端口等)以及存儲所有 Topic 信息
注冊成功后,Namesrv 集群中就有 Topic 跟 Broker 的映射關(guān)系
3.收發(fā)消息前,先創(chuàng)建 Topic 。創(chuàng)建 Topic 時,需要指定該 Topic 要存儲在哪些 Broker上。也可以在發(fā)送消息時自動創(chuàng)建Topic
4.Producer 發(fā)送消息
啟動時,先跟 Namesrv 集群中的其中一臺建立長連接,并從Namesrv 中獲取當(dāng)前發(fā)送的 Topic 存在哪些 Broker 上
然后跟對應(yīng)的 Broker 建立長連接,直接向 Broker 發(fā)消息
5.Consumer 消費消息
跟其中一臺 Namesrv 建立長連接,獲取當(dāng)前訂閱 Topic 存在哪些 Broker 上
然后直接跟 Broker 建立連接通道,開始消費消息*RocketMQ的消息領(lǐng)域模型
RocketMQ Message
Topic(主題): 表示消息的第一級類型,是最細(xì)粒度的訂閱單位(生產(chǎn)者傳遞消息和消費者提取消息標(biāo)識)
一條消息必須有一個Topic
一個Group可以訂閱多個Topic的消息
Topic一般為領(lǐng)域范圍,比如交易消息
Tag(標(biāo)簽): 表示消息的第二級類型,可以是使用相同的Topic不同的Tag來表示同一業(yè)務(wù)模塊的不同任務(wù)的消息,比如交易消息又可以分為:交易創(chuàng)建消息,交易完成消息等
助于保持代碼整潔和一致
簡化RocketMQ提供的查詢系統(tǒng)
Message(消息體): 消息是要傳遞的信息。Message中必須包含一個Topic,可選Tag和key-vaule鍵值對
Message Queue(消息隊列): 所有消息隊列都是持久化
一個Topic下可以有多個Queue
Queue的引入使得消息的存儲可以分布式集群化,具有了水平擴(kuò)展能力
Group(組): 分為Producer Group(生產(chǎn)者組)和Consumer Group(消費者組),具有相同角色組成Group
原生產(chǎn)者在交易后崩潰,broker可以聯(lián)系同一生產(chǎn)者組的不同生產(chǎn)者實例以進(jìn)行提交或回退交易。
消費者組的消費者實例必須具有完全相同的主題訂閱
RocketMQ 特性
Message Model(消息模式):
Clustering(集群式):當(dāng)使用集群消費模式時,MQ 認(rèn)為任意一條消息只需要被集群內(nèi)的任意一個消費者處理即可
Broadcasting(廣播式):當(dāng)使用廣播消費模式時,MQ 會將每條消息推送給集群內(nèi)所有注冊過的客戶端,保證消息至少被每臺機(jī)器消費一次
Message Order(消息順序)
使用DefaultMQPushConsumer時,可以決定按順序或同時使用消息
如果指定按順序使用,則消息使用的最大并發(fā)度是使用者組訂閱的消息隊列數(shù)
在此模式下不再保證消息順序
Concurrently:同時使用消息時,消息使用的最大并發(fā)性僅受為每個使用方客戶端指定的線程池限制
Orderly:有序地使用消息意味著消息的消費順序與生產(chǎn)者為每個消息隊列發(fā)送消息的順序相同。( 如果要處理必須強(qiáng)制執(zhí)行全局順序的情況,請確保您使用的主題只有一個消息隊列)
Message Types(消息類型)
事務(wù)消息
順序消息
延遲消息
RocketMQ單機(jī)版安裝
1.下載編譯源碼
# 下載$ > wget wget http://mirror.bit.edu.cn/apache/rocketmq/4.6.0/rocketmq-all-4.6.0-source- > # 解壓$ >unzip rocketmq-all-4.7.0-source-release.zip > cd rocketmq-all-4.7.0/ # 編譯$ > mvn -Prelease-all -DskipTests clean install -U > cd distribution/target/rocketmq-4.7.0/rocketmq-4.7.0
2.啟動 Name Server
# 啟動 Name Server 服務(wù) > nohup sh bin/mqnamesrv & # 啟動完成后,查看日志$ > tail -f ~/logs/rocketmqlogs/namesrv.log The Name Server boot success...
3.啟動 Broker
在 conf 目錄下,RocketMQ 提供了多種 Broker 的配置文件:
# 啟動 Broker服務(wù) > nohup sh bin/mqbroker -n localhost:9876 & # 啟動完成后,查看日志$ > tail -f ~/logs/rocketmqlogs/broker.log The broker[%s, 172.30.30.233:10911] boot success...
其中,參數(shù):
通過 -c 參數(shù),配置讀取的主 Broker 配置
通過 -n 參數(shù),設(shè)置 RocketMQ Namesrv 地址
broker.conf :單主,異步刷盤。
2m/ :雙主,異步刷盤。
2m-2s-async/ :兩主兩從,異步復(fù)制,異步刷盤。
2m-2s-sync/ :兩主兩從,同步復(fù)制,異步刷盤。
dledger/ :Dledger 集群,至少三節(jié)點
4.Send & Receive Messages(消息發(fā)送與接收)
在發(fā)送/接收消息之前,我們需要告知client(生產(chǎn)者/消費者)Name Servers的地址。RocketMQ提供了多種方法來實現(xiàn):
為簡單起見,我們使用環(huán)境變量:NAMESRV_ADDR,如下所示:
# 設(shè)置 Name Servers的地址$ > export NAMESRV_ADDR=localhost:9876 # 生產(chǎn)消息$ > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer SendResult [sendStatus=SEND_OK, msgId= ... # 消費消息$ > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer ConsumeMessageThread_%d Receive New Messages: [MessageExt...
在代碼中設(shè)置:producer.setNamesrvAddr("ip:port")
java屬性配置:rocketmq.namesrv.addr
環(huán)境變量配置:NAMESRV_ADDR
HTTP Endpoint
感謝各位的閱讀!關(guān)于“RocketMQ架構(gòu)原理的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。