代码编织梦想

1 概念

Namesrv的主要功能是临时存储管理Topic路由信息,各个Namesrv节点之间是不通信无状态的,互相不知道对方的存在。
当Broker,生产者,消费者启动的时候,会轮询全部的Namesrv节点,获取路由信息。

2 核心数据结构和API

2.1 Namesrv的核心数据结构

Namesrv中保存的信息是Topic的路由信息,Topic的路由决定了Topic的信息发送给哪些Broker,或者从哪些Broker获取消息。

路由数据结构的实现代码都在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中,根据方法名很容易判断出来方法的作用。

 

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架构

下图是一个消息的常规流转过程,生产者,消费者,Broker通过与Namesrv交换信息来实现自己的功能。

 

 

3.1组件

Broker

Broker在启动的时候,将自己的元数据信息,上报给Namesrv,这部分信息也就是Topic路由。

这里的元数据包含Broker本身的元数据和该Broker中Topic的信息。

生产者

生产者只关注Topic路由,从namesrv获取到Topic路由后就可以知道这个Topic的消息存放到了哪些Broker中。

消费者

消费者也只关注Topic路由,从namesrv获取到获取到Topic路由之后,才能知道自己订阅的Topic的Broker地址,从而获取消息。

3.2 Namesrv有四个功能模块:

Topic功能管理模块

这是Namesrv最核心的模块,Topic路由决定,Topic的数据会保存在哪些Broker上。Broker启动的时候,会将自身的信息注册到Namesrv中,以供消费者和生产者获取。生产者和消费者与Namesrv之间会有心跳通信,从而获取最新的Broker信息。

Remoting通信模块

这个模块是基于Netty的网络通信封装,担任各个组件之间的网络通信任务。

定时任务模块

定时任务模块包括:定时扫描宕机的Broker,定时打印KV配置,定时扫描超时请求。

KV管理模块

Namesrv维护了一个全局的KV配置魔窟啊,方便全局配置。


 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_73088370/article/details/126288764

RocketMQ路由中心NameServer-爱代码爱编程

1. 前言 NameServer 是整个Rocketmq 的大脑,是为了控制多台消息服务器,解决单点宕机问题问题而设计的。 2. NameServer启动流程 从NameServer启动类org.apache.rocketmq.namesrv.NameSrvStartup可以看出,NameServer的启动第一步先加载NameServerConfig

RocketMQ 源码分析之路由中心(NameServer)-爱代码爱编程

你可能没有看过 RocketMQ 的架构图,没关系,一起来学习一下,RocketMQ 架构图如下: 在 RocketMQ 中,有四个角色: Producer:消息的生产者,每个 MQ 中间件都有。Consumer:消息的消费者,每个 MQ 中间件都有。NameServer:RocketMQ 的路由中心,跟 ZooKeeper 差不多。Broker:

Java:RocketMQ 是如何解决服务状态管理的?-爱代码爱编程

你可能没有看过 RocketMQ 的架构图,没关系,一起来学习以下,RocketMQ 架构图如下:   在 RocketMQ 中,有四个角色: Producer:消息的生产者,每个 MQ 中间件都有。Consumer:消息的消费者,每个 MQ 中间件都有。NameServer:RocketMQ 的路由中心,跟 ZooKeeper 差不多。Brok

二 :RocketMq路由中心NameService,NameService路由注册、故障剔除-爱代码爱编程

1.NameService作用 NameServioce主要作用是为消息生产者和消息消费者提供关于主题Topic的路由信息,NameServioce需存储路由的基本信息,还需要管理Broker节点,包括路由注册和删除等功能 2.路由元信息 RocketMq基于订阅发布机制,一个topic拥有多个消息队列,一个Broker为每个主题默认创建四个读队

rocketmq 重复消费_消息队列 RocketMQ-爱代码爱编程

引言 本文整理了RocketMQ的相关知识,方便以后查阅。 功能介绍 简单来说,消息队列就是基础数据结构课程里“先进先出”的一种数据结构,但是如果要消除单点故障,保证消息传输的可靠性,并且还能应对大流量的冲击,对消息队列的要求就很高了。现在互联网“微架构”模式兴起,原有大型集中式的IT服务因为各种弊端,通常被分拆成细粒度的多个“微服务”,这些微

RocketMQ 路由中心 NameServer-爱代码爱编程

本章主要介绍 RocketMQ 路由管理 、 服务注册及服务发现的机制, NameServer 是整个RocketMQ 的“大脑” 。 本章重点内容如下 。 • NameServer 整体架构设计 • NameServer 动态路由发现与剔除机制 2.1 NameServer 架构设计 消息中间件的设计思路一般基于主题的订阅发布机制 消息生产者( Prod

RocketMQ之NameServer详解-爱代码爱编程

文章目录 前言一、NameServer的作用二、NameServer启动过程1.启动类NamesrvStartup三、NameServer路由注册1、路由元信息2、Broker发送心跳包3、NameServer处理心跳包四、NameServer路由删除五、NameServer路由发现总结 前言 RocketMQ是阿里巴巴开源的一个顶级项目,高

从源码角度窥探RocketMQ之NameServer原理-爱代码爱编程

NameServer架构设计 NameServer可以说是RocketMQ的“大脑”。她负责路由管理、服务注册及服务发现。客户端想要往服务端发送消息或者从服务端订阅消息时,必须要知道服务端的路由信息。在服务端集群部署下,更加尤为重要。为了解决这个问题,必须引入类似zookeeper这类分布式协调中心。那么业界已有ZK这个神器,为何RocketMQ要架设N

RocketMQ 基础入门-爱代码爱编程

RocketMQ 基础入门 RocketMQ 基础入门1 RocketMQ 介绍1.1 RocketMQ 特点1.2 RocketMQ 优势2 RocketMQ 基本概念2.1 NameServer2.1.1 NameServer作用2.1.2 和zk的区别2.1.3 高可用保障2.2 Broker2.2.1 部署方式2.3 生产者(Produce

RocketMQ 入门全面教程 超详细-爱代码爱编程

文章目录 一 MQ的安装1.1 官方地址下载1.2 环境需要1.3 注意事项1.3.1 需要关闭虚拟机linux防火墙1.3.2 主机防火墙1.4 配置项1.4.1 broker 配置1.4.2 nameServer 配置1.5 启动 NameServer1.5.1 NameServer 日志1.6 启动 Broker1.6.1 Broker 日志

RocketMQ学习笔记(二)——基础模块认识-爱代码爱编程

话接上篇RocketMQ学习笔记(一) 笔记一是带着几个问题去做学习记录的,问题如下: 1.为什么要引用MQ? 2.MQ能做什么? 3.确定引入后怎么选择合适的MQ? 4.引入MQ后带来哪些新的问题? 5.IDEA怎么编译RocketMQ源码 其中重点内容还是在初步了解MQ的特性和使用场景,并没有针对引用MQ后所带来的新问题进行深入的探究。 因此

RocketMQ—NameServer总结及核心源码剖析-爱代码爱编程

​一、NameServer介绍 NameServer 是专为 RocketMQ 设计的轻量级名称服务,具有简单、可集群横向扩展、无状态,节点之间互不通信等特点。整个Rocketmq集群的工作原理如下图所示: ​ 可以看到,RocketMQ架构上主要分为四部分, Broker、Producer、Consumer、NameServer

1. RocketMq基础入门-爱代码爱编程

RocketMq基础入门 http://rocketmq.apache.org/dowloading/releases/ docker 搭建rocketmq 暂略 为什么要用消息中间件? 应用解耦 流量削峰 数据分发 通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方

rocketmq基本介绍及docker安装_浅唱~幸福的博客-爱代码爱编程

1.介绍 RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯   支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型   在一个队列中可靠的先进先出(FIFO)和严格的顺序传递 (RocketMQ可以保证严格的消息顺序,而​​​​​​​RocketMQ无法保证) 支持拉(pul

rocketmq学习-爱代码爱编程

1.RocketMQ概述 RocketMQ简介 RocketMQ是一个统一的消息传递引擎,轻量级的数据处理平台 MQ的作用 下面以订单系统为例 1.解耦 引入消息队列之前,下单完成之后,需要订单服务去调用库存服务减