rocketmq知識(shí)點(diǎn)概要

前言

MQ現(xiàn)在在互聯(lián)網(wǎng)公司算是一個(gè)必不可少的中間件了,我們都知道MQ可以用來(lái)流量削峰秋冰,異步解耦仲义,但是總覺(jué)得只停留在最基本的使用上。正好最近看了一遍《RocketMQ實(shí)戰(zhàn)與原理解析》這本書(shū),講的內(nèi)容不見(jiàn)得有多高深埃撵、多全面尸诽,但是看完了回憶一遍,好多東西感覺(jué)只有一個(gè)模糊的印象盯另,還是分章記下來(lái)可靠一點(diǎn)性含。

快速入門(mén)

主要介紹了MQ在實(shí)際中的應(yīng)用場(chǎng)景

應(yīng)用解耦

非關(guān)鍵鏈路服務(wù)掛掉后,MQ可以緩存消息鸳惯,等服務(wù)再啟動(dòng)再去完成商蕴,不影響主鏈路的運(yùn)行。

流量削峰

可以使用普通性能的服務(wù)器加消息隊(duì)列來(lái)應(yīng)對(duì)高峰期請(qǐng)求芝发,節(jié)約開(kāi)支

消息分發(fā)

數(shù)據(jù)的產(chǎn)生方只需要把各自的數(shù)據(jù)寫(xiě)人一個(gè)消息隊(duì)列即可绪商,數(shù)據(jù)使用方根據(jù)各自需求訂閱感興趣的數(shù)據(jù),不同數(shù)據(jù)團(tuán)隊(duì)所訂閱的數(shù)據(jù)可以重復(fù)也可以不重復(fù)辅鲸,互不干擾格郁,也 不必和數(shù)據(jù)產(chǎn)生方關(guān)聯(lián)。

最終一致性独悴、動(dòng)態(tài)擴(kuò)容

生產(chǎn)環(huán)境下的配置和使用

角色——郵局

  1. Producer——發(fā)信者
  2. Consumer——收信者
  3. Broker——負(fù)責(zé)暫存例书、傳輸?shù)泥]局
  4. NameServer——負(fù)責(zé)協(xié)調(diào)各個(gè)地方郵局的管理機(jī)構(gòu)
image

常用配置參數(shù)

  • namesrvAddr=192.168.100.131:9876;192.168.100.132:9876

NamerServer的地址,可以是多個(gè)

  • brokerClusterName=DefaultCluster

Cluster 的地址刻炒,如果集群機(jī)器數(shù)比較多决采,可以分成多個(gè)Cluster,每個(gè)Cluster供一個(gè)業(yè)務(wù)群使用

  • brokerName=broker-b

Broker 的名稱(chēng)坟奥, Master 和 Slave 通過(guò)使用相同的 Broker 名稱(chēng)來(lái)表明相互關(guān)系树瞭,以說(shuō)明某個(gè) Slave 是哪個(gè) Master 的 Slave

  • brokerid=0

一個(gè) Master Barker可以有多個(gè) Slave, 0表示 Master,大于 0表示不同 Slave 的 ID

  • deleteWhen=04

與 fileReservedTime參數(shù)呼應(yīng)爱谁,表明在幾點(diǎn)做消息刪除動(dòng)作晒喷,默認(rèn)值04表示凌晨4點(diǎn)

  • fileReservedTime=48

在磁盤(pán)上保存消息的時(shí)長(zhǎng),單位是小時(shí)访敌,自動(dòng)刪除超時(shí)的消息

  • brokerRole=SYNC_MASTER

brokerRole 有 3 種: SYNC_MASTER凉敲、ASYNC_MASTER、SLAVE捐顷。 關(guān)鍵 詞 SYNC 和 ASYNC 表示 Master 和 Slave 之間同步消息的機(jī)制荡陷, SYNC 的意思 是當(dāng) Slave 和 Master 消息同步完成后,再返回發(fā)送成功的狀態(tài)

  • flushDiskType=ASYNC_FLUSH

flushDiskType表示刷盤(pán)策略迅涮,分為SYNC_FLUSH和ASYNC_FLUSH兩種,分別代表同步刷盤(pán)和異步刷盤(pán)徽龟。 同步刷盤(pán)情況下叮姑,消息真正寫(xiě)人磁盤(pán)后再返回成功狀態(tài);異步刷盤(pán)情況下,消息寫(xiě)人 page_cache 后就返回成功狀態(tài)

  • listenPort=10911

Broker監(jiān)聽(tīng)的端口號(hào),如果一臺(tái)機(jī)器上啟動(dòng)了多個(gè) Broker传透, 則要設(shè)置不同的端口號(hào)耘沼,避免沖突

  • storePathRootDir=/home/rocketmq/store-b

存儲(chǔ)消息以及一些配置信息的根目錄

常用管理命令

  1. 創(chuàng)建/修改 Topic
  2. 刪除 Topic
  3. 創(chuàng)建/修改訂閱組
  4. 刪除訂閱組
  5. 更新 Broker配置
  6. 更新 Topic 的讀寫(xiě)權(quán)限
  7. 查詢 Topic 的路由信息
  8. 查看 Topic 列表信息
  9. 查看 Topic 統(tǒng)計(jì)信息
  10. 根據(jù)時(shí)間查詢消息
  11. 根據(jù)消息 ID 查詢消息
  12. 查看集群消息

圖形界面管理

rocketmq-console

用適合的方式發(fā)送和接收消息

消費(fèi)者

  1. DefaultMQPushConsumer
  • 由系統(tǒng)控制讀取操作,收到消息后自動(dòng)調(diào)用傳人的 處理方法來(lái)處理
  • Clustering:由 Broker 端存儲(chǔ)和控制 Offset 的值朱盐, Broadcasting:Offset存到本地
  1. DefaultMQPul!Consumer
  • 讀取操作中的大部分功 能由使用者自主控制
  • 自己處理Offset

生產(chǎn)者

  1. DefaultMQProducer
  • 發(fā)往指定的Message Queue群嗤,使用MessageQueueSelector

消息模式

  • Clustering
    同一個(gè) ConsumerGroup(GroupName相同) 里的每個(gè) Consumer 只消費(fèi)所訂閱消息的一部分內(nèi)容,同一個(gè) ConsumerGroup 里所有的 Consumer消費(fèi)的內(nèi)容合起來(lái)才是所訂閱 Topic 內(nèi)容的整體兵琳,從而達(dá)到負(fù)載均衡的目的

  • Broadcasting
    同一個(gè) ConsumerGroup里的每個(gè) Consumer都能消費(fèi)到所訂閱 Topic 的全部消息狂秘,也就是一個(gè)消息會(huì)被多次分發(fā),被多個(gè) Consumer消費(fèi)

分布式消息隊(duì)列的協(xié)調(diào)者

NameServer功能

  • NameServer本身是無(wú)狀態(tài)的躯肌,也就是說(shuō) NameServer 中的 Broker者春、Topic 等狀態(tài)信息不會(huì)持久存儲(chǔ),都是由各個(gè)角色定時(shí)上報(bào)并存儲(chǔ)到內(nèi)存中的(NameServer支持配置參數(shù)的持久化清女,一般用不到)
  • 代表集群狀態(tài)的五個(gè)變量钱烟,org.apache.rocketmq.namesrv.routeinfo.RoutelnfoManager
  1. private final HashMap<String/* topic */, List<QueueData>> topicQueueTable topicQueueTable

topic映射broker

  1. private final HashMap<String/* BrokerName */, BrokerData> BrokerAddrTable

brokerName映射broker

  1. private final HashMap<String/* ClusterName */, Set<String/* BrokerName */>> ClusterAddrTable
  2. private final HashMap<String/* BrokerAddr */, BrokerLivelnfo> BrokerLiveTable

BrokerAddr映射broker信息

  1. private final HashMap<String/* BrokerAddr */, List<String>/* Filter Server*/> filterServerTable

BrokerAddr映射過(guò)濾服務(wù)器

底層通信機(jī)制

image

image
  • 核心命令類(lèi)——RemotingCommand

消息隊(duì)列的核心機(jī)制

  • 使用mmap實(shí)現(xiàn)“零拷貝”

消息存儲(chǔ)結(jié)構(gòu)

image
  • 核心——ConsumeQueue和CommitLog

CommitLog順序?qū)懀S機(jī)讀嫡丙,好處:

  1. 順序?qū)懰┫岣邔?xiě)入效率
  2. 隨機(jī)讀,利用操作系統(tǒng)的 pagecache 機(jī)制曙博,加速后續(xù)的讀取速度
  3. 為了保證完全的順序?qū)懙狙铮枰?ConsumeQueue 這個(gè)中間結(jié)構(gòu) ,因?yàn)?ConsumeQueue 里只存偏移量信息羊瘩,所以尺寸是有限的泰佳,在實(shí)際情況中,大部分的 ConsumeQueue 能夠被全部讀人內(nèi)存尘吗,所以這個(gè)中間結(jié)構(gòu)的操作速度很快逝她,可以認(rèn)為是內(nèi)存讀取的速度 。 此外為了保證 CommitLog 和 ConsumeQueue 的一 致性睬捶, CommitLog 里存儲(chǔ)了 ConsumeQueues黔宛、 Message key、 Tag 等所有信息擒贸, 即使 ConsumeQueue 丟失臀晃,也可以通過(guò) commitLog 完全恢復(fù)出來(lái)

高可用性機(jī)制

  1. 消費(fèi)端:Master和Slave,自動(dòng)切換
  2. 發(fā)送端:把 Topic 的多個(gè) Message Queue創(chuàng)建在多個(gè) Broker組上

同步刷盤(pán)和異步刷盤(pán)

image

同步復(fù)制和異步復(fù)制

同步復(fù)制方式是 等 Master 和 Slave 均寫(xiě)成功后才反饋給客戶端寫(xiě)成功狀態(tài);異步復(fù)制方式是只要 Master 寫(xiě)成功即可反饋給 客戶端寫(xiě)成功狀態(tài)介劫。

可靠性優(yōu)先的使用場(chǎng)景

順序消息

  1. 全局順序——基本不用
  2. 部分順序
  • 要保證部分消息有序徽惋,需要發(fā)送端和消費(fèi)端配合處理。在發(fā)送端座韵,要做到把同一業(yè)務(wù) ID 的消息發(fā)送到同一個(gè) Message Queue ;在消費(fèi)過(guò)程中险绘,要做到從同一個(gè) Message Queue 讀取的消息不被并發(fā)處理踢京,這樣才能達(dá)到部分有序。
  • 發(fā)送端使用MessageQueueSelector宦棺,消費(fèi)端使用MessageListenerOrderly
  • 在 MessageListenerOrderly 的實(shí)現(xiàn)中瓣距,為每個(gè) Consumer Queue 加個(gè)鎖,消費(fèi)每個(gè)消息前代咸,需要先獲得這個(gè)消息對(duì)應(yīng)的 Consumer Queue 所對(duì)應(yīng)的鎖蹈丸,這樣保證了同一時(shí)間,同一個(gè) Consumer Queue 的消息不被并發(fā)消費(fèi)呐芥,但
    不同 Consumer Queue 的消息可以并發(fā)處理 逻杖。

消息重復(fù)問(wèn)題

  1. 冪等
  2. 維護(hù)已消費(fèi)消息的記錄

動(dòng)態(tài)增減機(jī)器(NameServer、Broker)贩耐,故障對(duì)消息影響弧腥,消息優(yōu)先級(jí)

吞吐量?jī)?yōu)先的使用場(chǎng)景

在 Broker 端進(jìn)行消息過(guò)濾

  1. 通過(guò) Tag 進(jìn)行過(guò)濾
  2. 用 SQL 表達(dá)式的方式進(jìn)行過(guò)濾
  3. Filter Server方式過(guò)濾

提高 Consumer 處理能力

  1. 提高消費(fèi)并行度
  2. 以批量方式進(jìn)行消費(fèi)
  3. 檢測(cè)延時(shí)情況,跳過(guò)非重要消息

Consumer 的負(fù)載均衡

提高 Producer 的發(fā)送速度

  1. Oneway 方式只發(fā)送請(qǐng)求不等待應(yīng)答潮太,即將數(shù)據(jù)寫(xiě)人客戶端的Socket緩沖區(qū)就返回管搪,不等待對(duì)方返回結(jié)果
  2. 增加 Producer 的并發(fā)量

主從同步機(jī)制

  1. 同步屬性信息
  2. 同步消息體——CommitLog同步不是經(jīng)過(guò) netty command 的方式, 而是直接進(jìn)行 TCP 連接铡买,這樣效率更高更鲁。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奇钞,隨后出現(xiàn)的幾起案子澡为,更是在濱河造成了極大的恐慌,老刑警劉巖景埃,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒至,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谷徙,警方通過(guò)查閱死者的電腦和手機(jī)拒啰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)完慧,“玉大人谋旦,你說(shuō)我怎么就攤上這事∏幔” “怎么了册着?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)脾歧。 經(jīng)常有香客問(wèn)我甲捏,道長(zhǎng),這世上最難降的妖魔是什么涨椒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任摊鸡,我火速辦了婚禮绽媒,結(jié)果婚禮上蚕冬,老公的妹妹穿的比我還像新娘免猾。我一直安慰自己,他們只是感情好囤热,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布猎提。 她就那樣靜靜地躺著,像睡著了一般旁蔼。 火紅的嫁衣襯著肌膚如雪锨苏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天棺聊,我揣著相機(jī)與錄音伞租,去河邊找鬼。 笑死限佩,一個(gè)胖子當(dāng)著我的面吹牛葵诈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祟同,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼作喘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了晕城?” 一聲冷哼從身側(cè)響起泞坦,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砖顷,沒(méi)想到半個(gè)月后贰锁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡滤蝠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年豌熄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片几睛。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡房轿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出所森,到底是詐尸還是另有隱情囱持,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布焕济,位于F島的核電站纷妆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏晴弃。R本人自食惡果不足惜掩幢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一逊拍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧际邻,春花似錦芯丧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至轮听,卻和暖如春骗露,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背血巍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工萧锉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人述寡。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓柿隙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辨赐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子优俘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容