日常工作中使用過RabbitMQ、RocketMQ、Kafka這幾個常用的MQ,為了備忘,將RocketMQ相關(guān)資料上傳這里。
關(guān)鍵概念:
Producer(生產(chǎn)者)

Consumer(消費者)

Producer Group(生產(chǎn)者組)
維護生產(chǎn)組
當某臺producer宕機時,broker會向同組其他producer確認事務(wù)情況
Consumer Group(消費者組)
負責將consumer分組
根據(jù)此會制定消費方式
Broker

消費方式
廣播消費(類似于 JMS pub/sub): 所有的consumergoup的所有consumer都會消費到同一條消息
集群消費(同consumergroup內(nèi)類似于 JMS point-to-point):每個consumergroup都會有一個consumer消費到消息
NameSrv(域名服務(wù))
管理多broker常用
維護broker路由
Topic(主題)
正常TOPIC:需要提前創(chuàng)建
重試隊列 RETRY TOPIC:創(chuàng)建ConsumerGroup時自動創(chuàng)建
死信隊列 DLQ(Dead Letter Queue) TOPIC:創(chuàng)建ConsumerGroup時自動創(chuàng)建
MessageQueue(消息隊列)
可理解為一個不限長的Array,會定期移除過期(超時)的消息數(shù)據(jù)
topic下存儲消息的offset單位(邏輯隊列),也是發(fā)送的路徑
設(shè)定topic的時候可以指定 寫隊列數(shù)與讀隊列數(shù)
通過offset概念來維護,offset是long型,理論百年不會溢出
了解kafka的可以按partition理解
Message(消息)
消息,使用MQ發(fā)送的消息內(nèi)容,每次只會向一個Queue發(fā)送消息
MsgID,RocketMQ服務(wù)器生成
MsgKey,生產(chǎn)者生成
Tag,標簽。在消息上的信息,用于隔離消息:隔離可以由消費者過濾,隔離也可以由RocketMQ服務(wù)過濾
順序消息
可以通過業(yè)務(wù)hash ,將同hash的消息放入同隊列,然后使用有序listener去消費
特性策略及方法
Message Priority(優(yōu)先級)
RocketMQ不支持消息優(yōu)先級
可以通過指定Broker/Queue的方式來做優(yōu)先級隔離
Message Filter(過濾)
Broker過濾,通過配置subExpression
Consumer過濾,通過消費代碼解析Tag過濾
Message Persistence(持久化)
持久化到MYSQL:Buffer擴展
KV存儲系統(tǒng),Buffer擴展
文件,Buffer擴展
內(nèi)存鏡像,鏡像恢復(fù)
消息本身存儲在內(nèi)存buffer內(nèi)
異步刷盤,JVM->PAGECACHE->刷盤
mmap+write(0拷貝),MappedByteBuffer(nio文件讀寫模型,直接映射到緩沖區(qū)pagecache),文件映射到內(nèi)存上,減少了直接調(diào)用os的系統(tǒng)命令,進行從內(nèi)核空間和用戶空間的拷貝操作
Message Reliablity(消息可靠)
RocketMQ消息基本不丟。因此稱其可靠。
不丟或少丟的情況:Broker正常關(guān)閉,Broker Crash,OS Crash,供電閃斷等
非雙寫模式全丟的情況:無法開機,磁盤損壞等
Low Latency Messaging(低延遲)
RocketMQ使用長輪詢pull,較低延遲的將消息獲取到消費者服務(wù)
Repeat Message(消息重復(fù))
At least Once(消息至少投遞一次):Consumer只有消費成功才會ACK,但是不保證廣播每個consumer都能收到消息
Exactly Only Once(消息僅一次):業(yè)務(wù)控制-不能重復(fù)生產(chǎn);業(yè)務(wù)控制-不能重復(fù)消費;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?RocketMQ不能嚴格保證不重復(fù);當消息狀態(tài)不可知時,會重復(fù);網(wǎng)絡(luò)問題;宕機問題等
Consume Again(消息回溯/重新消費)
RockerMQ可以按照時間回溯消費
Store(消息存儲)
Consume Queue
~/store/consumequeue/${topic}/${queue}/${file},用于記錄位置信息,定位commitlog內(nèi)位置(offset記錄)
Commit Log
消息內(nèi)容的物理文件(mapped),通過Consume Queue的offset信息指定
config
????consumerOffset????
????????consumerOffset.json
? ? ? ?offsetTable(標記所有消息消費offset的數(shù)據(jù))
????????key:topic@consumergroup
????????通常集群會有效維護/廣播會在本地再維護一個
????delayOffset
????????存儲延遲消息數(shù)據(jù)
????????delayOffset.json
????subscriptionGroup
????????存儲所有消費組的配置信息
????????subscriptionGroup.json
????topics
????????存儲所有的topic信息
????????topics.json
????index
????????索引結(jié)構(gòu)維護
Send Message(消息發(fā)送)
同步、異步、單向
還有物理結(jié)構(gòu)圖,邏輯結(jié)構(gòu)圖,管理臺說明。這些部分繪圖需要一定時間,后續(xù)抽空補充。