RocketMQ原理解析
說明:
1.NameServer名稱服務(wù)
NameServer是沒有狀態(tài)的,即NameServer中的Broker和topic等狀態(tài)信息(通過其他角色上報獲炔绷ァ)都是保存在內(nèi)存中的吗购,不會持久化存儲(可通過配置實現(xiàn))宏蛉,集群可以橫向擴展。主要功能如下:
a.接收Broker(master和slave)啟動時的注冊路由信息;
b.為producer和consumer提供路由服務(wù),即通過topic名字獲取所有broker的路由信息东帅;
c.接收broker發(fā)送的心跳信息掠哥,如果心跳的時間戳過期NameServer關(guān)閉與broker的連接巩踏。
2.Broker
Broker向NameServer注冊topic配置信息,配置信息格式如下:
{
"perm":6,
"readQueueNums":2,
"topicFilterType":"SINGLE_TAG",
"topicName":"Topic-Lance",
"writeQueueNums":5
}
Broker的消息存儲
Rocketmq的消息的存儲是由consumeQueue和 commitLog 配合完成的续搀,commitLog保存消息的物理數(shù)據(jù)塞琼,consumeQueue是消息的邏輯隊列,類似于索引禁舷,存儲的是指向物理存儲的地址彪杉。在一個Broker上,只有一個commitLog牵咙,所有consumeQueue共享同一個commitLog派近。
假如topic的名字是Topic-Lance,配置的讀寫隊列有queue-1和queue-2洁桌,那么Topic-Lance和queue-1組成一個consumeQueue渴丸,Topic-Lance和queue-2組成另一個consumeQueue。
假如broker-A(包含queue-0,queue-1,queue-2), broker-B(包含queue-0,queue-1)兩臺broker機器都配置了Topic-Lance另凌,那么broker啟動的時候谱轨,注冊到NameServer的Topic-Lance的路由有broker-A-queue-0,broker-A-queue-1途茫,broker-A-queue-2碟嘴,broker-B-queue-0,broker-B-queue-1共5個consumeQueue囊卜。
為了提高讀寫性能娜扇,commitLog采取順序?qū)懀S機讀(通過pagecache機制批量從磁盤讀取到內(nèi)存栅组,加速后續(xù)的讀取速度)雀瓢,consumeQueue大部分讀入內(nèi)存(如果consumeQueue因為重啟等因素丟失,可以通過commitLog重建)
3.Producer 生產(chǎn)者
a.Producer發(fā)送消息時(必須制定topic),首先從本地的Producer集合中獲取topic->broker的路由信息玉掸,如果沒有刃麸,則從nameserver中獲取topic->broker路由,并緩存到本地集合司浪;
b.定時從nameServer獲取最新的topic路由信息泊业;
c.Producer定時將Producer的group信息發(fā)送到對應(yīng)的broker上把沼;
d.Producer發(fā)送消息到Master的broker上,通過Broker的主從復制copy到slave的broker上吁伺。
發(fā)送實現(xiàn)輪詢方式:
List<MessageQueue> messageQueueList;
AtomicInteger sendWhichQueue;
int index =(++sendWitchQueue)% messageQueueList.size
MessageQueue sendQueue = messageQueueList[index];
//sendQueue 為要發(fā)送的隊列
4.Consumer 消費者
a.向NameServer注冊Consumer饮睬;
b.定時從NameServer獲取topic路由信息;
c.定時清理下線的broker;
d.向所有broker發(fā)送心跳篮奄;
e.動態(tài)調(diào)整消費線程池;
f.負責負載均衡服務(wù)RebalanceService捆愁。
RocketMQ是基于pull模式拉取消息,consumer做負載均衡并通過長輪詢向broker拉消息窟却,長輪詢拉取消息后回調(diào)MessageListener接口實現(xiàn)完成消費昼丑。
關(guān)于RocketMQ長輪詢可參考:http://www.reibang.com/p/48dbc9eee890
5.數(shù)據(jù)丟失問題處理
RocketMQ默認保存3天,commit log刷盤間隔夸赫,默認1秒
......
6.消費重試機制
Producer端重試 :
默認情況下是失敗3次重試菩帝,可通過retryTimesWhenSendFailed定義重試次數(shù);
Consumer端重試:
1.Exception的情況憔足,一般重復16次 10s胁附、30s、1mins滓彰、2mins控妻、3mins等,可以通過設(shè)置transactionCheckMax設(shè)置揭绑;
2.超時情況(Consumer端沒有返回CONSUME_SUCCESS弓候,也沒有返回RECONSUME_LATER),MQ會無限制的發(fā)送給Consumer端他匪,默認超時時間時15分鐘菇存。