RocketMQ?Namesrv架構(gòu)工作原理詳解
1 概念
Namesrv的作用是保存元數(shù)據(jù),提高Broker的可用性。
Namesrv的主要功能是臨時(shí)存儲(chǔ),管理Topic路由信息,各個(gè)Namesrv節(jié)點(diǎn)之間是不通信,無(wú)狀態(tài)的,互相不知道對(duì)方的存在。
當(dāng)Broker,生產(chǎn)者,消費(fèi)者啟動(dòng)的時(shí)候,會(huì)輪詢?nèi)康腘amesrv節(jié)點(diǎn),獲取路由信息。
2 核心數(shù)據(jù)結(jié)構(gòu)和API
2.1 Namesrv的核心數(shù)據(jù)結(jié)構(gòu)
Namesrv中保存的信息是Topic的路由信息,Topic的路由決定了Topic的信息發(fā)送給哪些Broker,或者從哪些Broker獲取消息。
路由數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)代碼都在org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager中
public class RouteInfoManager {
private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
//Broker存活的時(shí)間周期,默認(rèn)120秒
private final static long DEFAULT_BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2;
private final ReadWriteLock lock = new ReentrantReadWriteLock();
//保存Topic和隊(duì)列的路由信息
private final Map<String/* topic */, Map<String, QueueData>> topicQueueTable;
//Broker名字和Broker信息的對(duì)應(yīng)信息
private final Map<String/* brokerName */, BrokerData> brokerAddrTable;
//集群和Broker的對(duì)應(yīng)關(guān)系
private final Map<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
//在線的Broker地址和Broker信息的對(duì)應(yīng)關(guān)系
private final Map<BrokerAddrInfo/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
//過(guò)濾服務(wù)器消息
private final Map<BrokerAddrInfo/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
private final Map<String/* topic */, Map<String/*brokerName*/, TopicQueueMappingInfo>> topicQueueMappingInfoTable;
private final BatchUnRegisterService unRegisterService;
private final NamesrvController namesrvController;
private final NamesrvConfig namesrvConfig;
2.2 Namesrv的API
Namesrv的的API在org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor中,根據(jù)方法名很容易判斷出來(lái)方法的作用。
switch (request.getCode()) {
case RequestCode.PUT_KV_CONFIG:
return this.putKVConfig(ctx, request);
case RequestCode.GET_KV_CONFIG:
return this.getKVConfig(ctx, request);
case RequestCode.DELETE_KV_CONFIG:
return this.deleteKVConfig(ctx, request);
case RequestCode.QUERY_DATA_VERSION:
return this.queryBrokerTopicConfig(ctx, request);
case RequestCode.REGISTER_BROKER:
//Broker注冊(cè)自身信息到Namesrv
return this.registerBroker(ctx, request);
case RequestCode.UNREGISTER_BROKER:
//Broker取消注冊(cè)自身信息到Namesrv
return this.unregisterBroker(ctx, request);
case RequestCode.BROKER_HEARTBEAT:
return this.brokerHeartbeat(ctx, request);
case RequestCode.GET_BROKER_MEMBER_GROUP:
return this.getBrokerMemberGroup(ctx, request);
case RequestCode.GET_BROKER_CLUSTER_INFO:
return this.getBrokerClusterInfo(ctx, request);
case RequestCode.WIPE_WRITE_PERM_OF_BROKER:
return this.wipeWritePermOfBroker(ctx, request);
case RequestCode.ADD_WRITE_PERM_OF_BROKER:
return this.addWritePermOfBroker(ctx, request);
case RequestCode.GET_ALL_TOPIC_LIST_FROM_NAMESERVER:
return this.getAllTopicListFromNameserver(ctx, request);
case RequestCode.DELETE_TOPIC_IN_NAMESRV:
return this.deleteTopicInNamesrv(ctx, request);
case RequestCode.REGISTER_TOPIC_IN_NAMESRV:
return this.registerTopicToNamesrv(ctx, request);
case RequestCode.GET_KVLIST_BY_NAMESPACE:
return this.getKVListByNamespace(ctx, request);
case RequestCode.GET_TOPICS_BY_CLUSTER:
return this.getTopicsByCluster(ctx, request);
case RequestCode.GET_SYSTEM_TOPIC_LIST_FROM_NS:
return this.getSystemTopicListFromNs(ctx, request);
case RequestCode.GET_UNIT_TOPIC_LIST:
return this.getUnitTopicList(ctx, request);
case RequestCode.GET_HAS_UNIT_SUB_TOPIC_LIST:
return this.getHasUnitSubTopicList(ctx, request);
case RequestCode.GET_HAS_UNIT_SUB_UNUNIT_TOPIC_LIST:
return this.getHasUnitSubUnUnitTopicList(ctx, request);
case RequestCode.UPDATE_NAMESRV_CONFIG:
return this.updateConfig(ctx, request);
case RequestCode.GET_NAMESRV_CONFIG:
return this.getConfig(ctx, request);
case RequestCode.GET_CLIENT_CONFIG:
return this.getClientConfigs(ctx, request);
default:
String error = " request type " + request.getCode() + " not supported";
return RemotingCommand.createResponseCommand(RemotingSysResponseCode.REQUEST_CODE_NOT_SUPPORTED, error);
}
3 Namesrv架構(gòu)
下圖是一個(gè)消息的常規(guī)流轉(zhuǎn)過(guò)程,生產(chǎn)者,消費(fèi)者,Broker通過(guò)與Namesrv交換信息來(lái)實(shí)現(xiàn)自己的功能。

3.1組件
- Broker
Broker在啟動(dòng)的時(shí)候,將自己的元數(shù)據(jù)信息,上報(bào)給Namesrv,這部分信息也就是Topic路由。
這里的元數(shù)據(jù)包含Broker本身的元數(shù)據(jù)和該Broker中Topic的信息。
- 生產(chǎn)者
生產(chǎn)者只關(guān)注Topic路由,從namesrv獲取到Topic路由后就可以知道這個(gè)Topic的消息存放到了哪些Broker中。
- 消費(fèi)者
消費(fèi)者也只關(guān)注Topic路由,從namesrv獲取到獲取到Topic路由之后,才能知道自己訂閱的Topic的Broker地址,從而獲取消息。
3.2 Namesrv四個(gè)功能模塊
- Topic功能管理模塊
這是Namesrv最核心的模塊,Topic路由決定,Topic的數(shù)據(jù)會(huì)保存在哪些Broker上。Broker啟動(dòng)的時(shí)候,會(huì)將自身的信息注冊(cè)到Namesrv中,以供消費(fèi)者和生產(chǎn)者獲取。生產(chǎn)者和消費(fèi)者與Namesrv之間會(huì)有心跳通信,從而獲取最新的Broker信息。
- Remoting通信模塊
這個(gè)模塊是基于Netty的網(wǎng)絡(luò)通信封裝,擔(dān)任各個(gè)組件之間的網(wǎng)絡(luò)通信任務(wù)。
- 定時(shí)任務(wù)模塊
定時(shí)任務(wù)模塊包括:定時(shí)掃描宕機(jī)的Broker,定時(shí)打印KV配置,定時(shí)掃描超時(shí)請(qǐng)求。
- KV管理模塊
Namesrv維護(hù)了一個(gè)全局的KV配置魔窟啊,方便全局配置。
以上就是RocketMQ Namesrv架構(gòu)工作原理詳解的詳細(xì)內(nèi)容,更多關(guān)于RocketMQ Namesrv架構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringCloud Finchley Gateway 緩存請(qǐng)求Body和Form表單的實(shí)現(xiàn)
在接入Spring-Cloud-Gateway時(shí),可能有需求進(jìn)行緩存Json-Body數(shù)據(jù)或者Form-Urlencoded數(shù)據(jù)的情況。這篇文章主要介紹了SpringCloud Finchley Gateway 緩存請(qǐng)求Body和Form表單的實(shí)現(xiàn),感興趣的小伙伴們可以參考一下2019-01-01
springboot集成nacos報(bào)錯(cuò):get data from Nacos
這篇文章給大家介紹了springboot集成nacos報(bào)錯(cuò):get data from Nacos error,dataId:null.yaml的原因及解決方法,如果又遇到相同問(wèn)題的朋友可以參考閱讀本文2023-10-10
Java多線程實(shí)現(xiàn)Callable接口
本文給大家分享的是使用Java多線程來(lái)實(shí)現(xiàn)callable接口的方法,以及使用方法,另外還有一個(gè)網(wǎng)友的實(shí)例,希望能夠?qū)Υ蠹艺莆認(rèn)ava多線程有所幫助。2016-06-06
SpringBoot集成Mybatis-Plus多租戶架構(gòu)實(shí)現(xiàn)
本文主要介紹了SpringBoot集成Mybatis-Plus多租戶架構(gòu)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Java 超詳細(xì)圖解集合框架的數(shù)據(jù)結(jié)構(gòu)
什么是集合框架呢?集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。最簡(jiǎn)單的集合如數(shù)組、列表和隊(duì)列等,任何集合框架一般包含:對(duì)外的接口、接口的實(shí)現(xiàn)和對(duì)集合運(yùn)算的算法2022-04-04
Mybatis傳單個(gè)參數(shù)和<if>標(biāo)簽同時(shí)使用的問(wèn)題及解決方法
這篇文章主要介紹了Mybatis傳單個(gè)參數(shù)和<if>標(biāo)簽同時(shí)使用的問(wèn)題及解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-05-05
解決Springboot項(xiàng)目中很多頁(yè)面出現(xiàn)Whitelabel Error Page(404)的問(wèn)題
最近在接手的前后端項(xiàng)目中發(fā)現(xiàn)其默認(rèn)路徑不是主機(jī)+端口(如:http://localhost:3453/)的形式,很多頁(yè)面的訪問(wèn)是加了一個(gè)層級(jí),只要訪問(wèn)頁(yè)面就會(huì)出現(xiàn)Whitelabel Error Page(404),所以本文給大家提供了解決方案,需要的朋友可以參考下2024-02-02

