RocketMQ是一款分布式股缸、隊列模型的消息中間件衡楞,單機支持1萬以上的持久化隊列,前提是足夠的內存敦姻、硬盤空間瘾境。
消息隊列主要的應用場景:異步處理,應用解耦镰惦,流量削峰迷守,消息通訊。
如上圖所示旺入, RocketMQ的部署結構有以下特點:
Name Server是一個幾乎無狀態(tài)節(jié)點兑凿,可集群部署,節(jié)點之間無任何信息同步茵瘾。
Broker部署相對復雜礼华,Broker分為Master與Slave,一個Master可以對應多個Slave拗秘,但是一個Slave只能對應一個Master圣絮,Master與Slave的對應關系通過指定相同的BrokerName,不同的BrokerId來定義雕旨,BrokerId為0表示Master扮匠,非0表示Slave。Master也可以部署多個凡涩。每個Broker與NameServer集群中的所有節(jié)點建立長連接棒搜,定時注冊Topic信息到所有Name Server。
Producer與Name Server集群中的其中一個節(jié)點(隨機選擇)建立長連接活箕,定期從Name Server取Topic路由信息力麸,并向提供Topic服務的Master建立長連接,且定時向Master發(fā)送心跳讹蘑。Producer完全無狀態(tài)末盔,可集群部署。
Consumer與Name Server集群中的其中一個節(jié)點(隨機選擇)建立長連接座慰,定期從NameServer取Topic路由信息陨舱,并向提供Topic服務的Master、Slave建立長連接版仔,且定時向Master游盲、Slave發(fā)送心跳误墓。Consumer既可以從Master訂閱消息,也可以從Slave訂閱消息益缎,訂閱規(guī)則由Broker配置決定谜慌。
Producer:?
消息的生產者,負責發(fā)送消息莺奔,將消息推送給broker欣范。一般由業(yè)務系統(tǒng)負責產生消息。
消息有3種發(fā)送方式:同步令哟、異步恼琼、單向。?
Broker:
rocketmq的核心組件屏富,負責消息的接收晴竞、存儲(持久化到磁盤)、被消費者拉取消息等功能狠半。
broker也存儲消息相關的元數(shù)據(jù)噩死,包括:消費者組、消費進度神年、topic&queue信息等已维。
Consumer:
消息的消費者,從broker上拉取消息從而進行消費瘤袖。rocketmq提供兩種消費者衣摩。
一般是后臺系統(tǒng)負責異步消費消息。
主動消費者:DefaultMQPullConsumer捂敌,從broker中拉取一批消息并消費艾扮,主動權由消費者控制。
被動消費者:DefaultMQPushConsumer占婉,消費者實現(xiàn)回調接口泡嘴,一旦有消息,broker回調接口逆济,消費者被動響應酌予。
Name Server:
注冊中心的作用,提供輕量級的服務發(fā)現(xiàn)和提供路由信息(broker的服務注冊與發(fā)現(xiàn))奖慌。
nameserver存有全量的路由信息抛虫,提供對等的讀寫服務,支持快速擴縮容简僧。
nameserver接收broker的請求建椰,注冊broker的路由信息。
nameserver接收client(producer/consumer)的請求岛马,根據(jù)消息的topic獲取相應的broker路由信息棉姐。
(手動創(chuàng)建的topic可以指定broker屠列,自動創(chuàng)建的topic會隨機指定broker,也許指定單個或全部伞矩,topic的概念在后面笛洛。)
Topic:
一種消息的邏輯分類(消息的類型),比如說你有訂單類的消息乃坤,也有庫存類的消息苛让,那么就需要進行分類存儲。
生產者方面:發(fā)消息時需指定topic侥袜,可以有1-n個生產者發(fā)布1個topic的消息蝌诡,
也1個生產者可以發(fā)布不同topic的消息。消費者方面:收消息時需訂閱topic枫吧,
可以有1-n個消費者組訂閱1個topic的消息,1個消費者組可以訂閱不同topic的消息宇色。
1個消息必須指定1個topic九杂,topic允許自動創(chuàng)建與手工創(chuàng)建,topic創(chuàng)建時需要指定broker宣蠕,可以指定1個或多個例隆,
name server就是通過broker與topic的映射關系來做路由。
producer和consumer在生產和消費消息時抢蚀,都需要指定消息的 topic镀层,當topic匹配時,
consumer 才會消費到producer發(fā)送的消息皿曲。
topic與broker是多對多的關系唱逢,一個topic分布在多個broker上,一個broker可以配置多個topic屋休。
Message:
message是消息的載體坞古。每個message必須指定一個topic,相當于寄信的地址劫樟。
message還有一個可選的tag設置痪枫,以便消費端可以基于tag進行過濾消息。
message還有擴展的kv結構叠艳,例如你可以設置一個業(yè)務key到你的消息中奶陈,在broker上查找消息并診斷問題。
Tag:
標簽可以被認為是對topic的進一步細化附较。一般在相同業(yè)務模塊中通過引入標簽來標記不同用途的消息吃粒。
區(qū)分相同topic下不同種類的消息。
生產到哪個topic的哪個tag下翅睛,消費者也是從topic的哪個tag進行消費声搁,即實現(xiàn)消息的過濾黑竞。
Queue:
queue是消息的物理管理單位,而topic是邏輯管理單位疏旨。一個topic下可以有多個queue很魂,
默認自動創(chuàng)建是4個,手動創(chuàng)建是8個檐涝。
queue的引入使得消息存儲可以分布式集群化遏匆,具有了水平擴展的能力。
1個message只能屬于1個queue谁榜、1個topic幅聘。
在rocketmq中,所有消息隊列都是持久化窃植,長度無限的數(shù)據(jù)結構帝蒿,所謂長度無限是指隊列中的每個存儲單元都是定長,
訪問其中的存儲單元使用offset來訪問巷怜,offset 為 java long 類型葛超,64 位,理論上在 100年內不會溢出延塑,
所以認為是長度無限绣张,另外隊列中只保存最近幾天的數(shù)據(jù),之前的數(shù)據(jù)會按照過期時間來刪除关带。
也可以認為 Message Queue是一個長度無限的數(shù)組侥涵,offset就是下標。
rocketmq中宋雏,producer將消息發(fā)送給broker時芜飘,需要指定發(fā)送到哪一個queue中,默認情況下好芭,
producer會輪詢的將消息發(fā)送到每個queue中燃箭,順序是隨機的,但總體上每個queue的消息數(shù)量均分舍败,
所有broker下的queue合并成一個list去輪詢招狸,
也可以由程序員通過MessageQueueSelector接口來指定具體發(fā)送到哪個queue中。
對于consumer而言邻薯,會為每個consumer分配固定的隊列(如果隊列總數(shù)沒有發(fā)生變化)裙戏,
consumer從固定的隊列中去拉取沒有消費的消息進行處理。
消費端會通過RebalanceService線程厕诡,10秒鐘做一次基于topic下的所有隊列負載累榜,獲取同一個Consumer Group下的所有Consumer實例數(shù)或Topic的queue的個數(shù)是否改變,通知所有Consumer實例重新做一次負載均衡算法。
Offset:
理解成消費進度壹罚,可自增葛作。
Commit log:
雖然每個topic下面有很多message queue,但是message queue本身并不存儲消息猖凛。
真正的消息存儲會寫在CommitLog的文件赂蠢,message queue只是存儲CommitLog中對應的位置信息,
方便通過message queue找到對應存儲在CommitLog的消息辨泳。 不同的topic虱岂,
message queue都是寫到相同的CommitLog 文件,也就是說CommitLog完全的順序寫菠红。
調用關系:
服務啟動順序:name server->broker->producer&consumer
每個broker與name server集群中的所有節(jié)點建立長連接第岖,
定時注冊topic&broker的路由信息到所有name server中。
producer與name server集群中的其中一個節(jié)點(隨機選擇)建立長連接试溯,
定期從name server獲取topic路由信息蔑滓,并向提供topic服務的broker master建立長連接,
且定期向broker master發(fā)送心跳耍共,produce無狀態(tài)烫饼,可集群部署。
producer只能將消息發(fā)送到broker master试读,但是consumer則不一樣。
consumer與name server集群中的其中一個節(jié)點(隨機選擇)建立長連接荠耽,定期從name server獲取topic路由信息钩骇,
consumer同時與提供topic服務的master和slave建立長連接且定時發(fā)送心跳,
consumer既可以從broker master訂閱消息铝量,也可以從broker slave訂閱消息倘屹,訂閱規(guī)則由broker配置決定。
broker一旦需要橫向擴展慢叨,只需要啟動更多的broker即可纽匙,然后把對應的topic建上,
客戶端的queue集合即會變大拍谐,并且由于每個group下面的topic的配置都是獨立的烛缔,
也就說可以讓broker1下面的那個topic的queue數(shù)量是4,其他broker下的topic queue數(shù)量是2轩拨,
這樣broker1則得到更大的負載践瓷。