欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

RocketMQ?Namesrv架構工作原理詳解

 更新時間:2022年08月10日 15:40:19   作者:奔跑的毛球  
這篇文章主要為大家介紹了RocketMQ?Namesrv架構工作原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1 概念

Namesrv的作用是保存元數(shù)據(jù),提高Broker的可用性。

Namesrv的主要功能是臨時存儲管理Topic路由信息,各個Namesrv節(jié)點之間是不通信無狀態(tài)的,互相不知道對方的存在。

當Broker,生產者,消費者啟動的時候,會輪詢全部的Namesrv節(jié)點,獲取路由信息。

2 核心數(shù)據(jù)結構和API

2.1 Namesrv的核心數(shù)據(jù)結構

Namesrv中保存的信息是Topic的路由信息,Topic的路由決定了Topic的信息發(fā)送給哪些Broker,或者從哪些Broker獲取消息。

路由數(shù)據(jù)結構的實現(xiàn)代碼都在org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager中

public class RouteInfoManager {
    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
    //Broker存活的時間周期,默認120秒
    private final static long DEFAULT_BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2;
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    //保存Topic和隊列的路由信息
    private final Map<String/* topic */, Map<String, QueueData>> topicQueueTable;
    //Broker名字和Broker信息的對應信息
    private final Map<String/* brokerName */, BrokerData> brokerAddrTable;
    //集群和Broker的對應關系
    private final Map<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
    //在線的Broker地址和Broker信息的對應關系
    private final Map<BrokerAddrInfo/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
    //過濾服務器消息
    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ù)方法名很容易判斷出來方法的作用。

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注冊自身信息到Namesrv
        return this.registerBroker(ctx, request);
    case RequestCode.UNREGISTER_BROKER:
        //Broker取消注冊自身信息到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架構

下圖是一個消息的常規(guī)流轉過程,生產者,消費者,Broker通過與Namesrv交換信息來實現(xiàn)自己的功能。

3.1組件

  • Broker

Broker在啟動的時候,將自己的元數(shù)據(jù)信息,上報給Namesrv,這部分信息也就是Topic路由。

這里的元數(shù)據(jù)包含Broker本身的元數(shù)據(jù)和該Broker中Topic的信息。

  • 生產者

生產者只關注Topic路由,從namesrv獲取到Topic路由后就可以知道這個Topic的消息存放到了哪些Broker中。

  • 消費者

消費者也只關注Topic路由,從namesrv獲取到獲取到Topic路由之后,才能知道自己訂閱的Topic的Broker地址,從而獲取消息。

3.2 Namesrv四個功能模塊

  • Topic功能管理模塊

這是Namesrv最核心的模塊,Topic路由決定,Topic的數(shù)據(jù)會保存在哪些Broker上。Broker啟動的時候,會將自身的信息注冊到Namesrv中,以供消費者和生產者獲取。生產者和消費者與Namesrv之間會有心跳通信,從而獲取最新的Broker信息。

  • Remoting通信模塊

這個模塊是基于Netty的網絡通信封裝,擔任各個組件之間的網絡通信任務。

  • 定時任務模塊

定時任務模塊包括:定時掃描宕機的Broker,定時打印KV配置,定時掃描超時請求。

  • KV管理模塊

Namesrv維護了一個全局的KV配置魔窟啊,方便全局配置。

以上就是RocketMQ Namesrv架構工作原理詳解的詳細內容,更多關于RocketMQ Namesrv架構的資料請關注腳本之家其它相關文章!

相關文章

  • 手把手教你k8s部署springboot服務

    手把手教你k8s部署springboot服務

    本文主要介紹了手把手教你k8s部署springboot服務,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 通過JDK源碼角度分析Long類詳解

    通過JDK源碼角度分析Long類詳解

    這篇文章主要給大家介紹了關于通過JDK源碼角度分析Long類的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用long類具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • SpringBoot版本升級容易遇到的一些問題

    SpringBoot版本升級容易遇到的一些問題

    由于項目需求,需要將nacos 1.4.6版本升級到2.x版本,由此引發(fā)的springboot、springcloud、springcloud Alibaba一系列版本變更,本文給大家總結一下SpringBoot版本升級容易遇到的一些問題,需要的朋友可以參考下
    2023-12-12
  • springboot詳解實現(xiàn)車險理賠信息管理系統(tǒng)代碼

    springboot詳解實現(xiàn)車險理賠信息管理系統(tǒng)代碼

    本系統(tǒng)基于Springboot開發(fā)實現(xiàn)了一個為用戶車險進行理賠信息管理的一個信息化管理系統(tǒng),核心的業(yè)務主要是用戶申請保險理賠,管理員審核進入理賠程序,事故調查員對事故進行調查和現(xiàn)場勘察,這其中共涉及到三類用戶,購買保險的客戶,事故調查員和系統(tǒng)管理員
    2022-06-06
  • 簡單聊一聊Java線程池ThreadPoolExecutor

    簡單聊一聊Java線程池ThreadPoolExecutor

    在使用線程池之后,開啟線程就變成了在線程池當中找到一個空閑的線程,銷毀線程變成了歸還線程到線程池的過程,下面這篇文章主要給大家介紹了關于Java線程池ThreadPoolExecutor的相關資料,需要的朋友可以參考下
    2022-06-06
  • 搞懂JAVAObject中的hashCode()

    搞懂JAVAObject中的hashCode()

    今天小編就為大家分享一篇關于關于Object中equals方法和hashCode方法判斷的分析,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • 詳解最簡單易懂的Spring Security 身份認證流程講解

    詳解最簡單易懂的Spring Security 身份認證流程講解

    這篇文章主要介紹了詳解最簡單易懂的Spring Security 身份認證流程講解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Java對象為null的問題解決

    Java對象為null的問題解決

    如果一個對象為空,但是此時我們調用它的方法,就會遇到NullPointerException問題,本文主要介紹了Java對象為null的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • Spring注解開發(fā)生命周期原理解析

    Spring注解開發(fā)生命周期原理解析

    這篇文章主要介紹了Spring注解開發(fā)生命周期原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 簡單了解java局部變量與成員變量的區(qū)別

    簡單了解java局部變量與成員變量的區(qū)別

    這篇文章主要介紹了簡單了解java局部變量與成員變量的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10

最新評論