(三)RocketMQ源码分析之组件NameServer的服务注册删除发现

  • 概述
    NameServer主要作用就是broker,producer,comsumer之间的一个中间组件,今天这篇文章主要讲解NameServer和broker之间的关系。

  • NameServer机制
    在这里插入图片描述
    1.broker在启动的时候,会指定nameServer注册到nameServer中,一个broker可以注册到多个NameServer中,并且会启动一个定时任务(心跳),每30s调用一次nameServer服务进行注册
    2.NameServer每隔10秒钟会检测路由表中的信息,如果存在有120s的broker最近都没来注册,那么NameServer当做这个broker死掉了,那么会把他剔除
    3.多个NameServer是不通信的,也就是说多个NameServer之间不需要保持数据一致,这样对网络要求降低了,并且实现难度也比一般注册中心(zookeeper)实现起来简单.NameServer设计初衷只要能起到解耦和提供高可用就行了。

  • 服务注册
    在这里插入图片描述
    说明:很明显,broker和NameServer不是在同一个服务,很明显是需要使用远程调用,这个通信是服务级别的,上面这个DefaultRequestProcessor就是专门处理网络请求调用的,broker的心跳注册,producer发送信息需要获取路由信息等都是请求到DefaultRequestProcessor来进行处理的。
    在这里插入图片描述
    说明: 每一个外部网络请求都有一个请求码唯一标识,然后会调用相应方法进行处理
    在这里插入图片描述
    1.判断当前调用的broker指定注册到的哪个集群中,如果存在这个集群,那么直接加入到这个broker中,如果不存在,那么初始化一个集群,并把broker交给NameServer管理
    2.将当前调用的broker的机器信息注册到NameServer中,每个broker使用一个brokerName进行标识,那么一个broker就存在多个节点构成,对应一台master和多台slaver,那么就会将机器信息都存入到第二个Map中
    在这里插入图片描述
    1.入过这个broker是一个master,并且是首次加入,那么会为broker创建一些默认的主题,一共是9个,具体可以看到数据文件夹(store/{brokerName}/config/topic.json)下面的topic.json文件,那就是默认创建的主题
    2.更新当前broker的心跳时间

    6:24 INFO RemotingExecutorThread_1 - 接受到请求:RemotingCommand [code=103, language=JAVA, version=333, opaque=111, flag(B)=0, remark=null, extFields={brokerId=0, bodyCrc32=1291881136, clusterName=DefaultCluster, brokerAddr=192.168.0.105:10911, haServerAddr=192.168.0.105:10912, compressed=false, brokerName=broker-a}, serializeTypeCurrentRPC=JSON]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, %RETRY%please_rename_unique_group_name QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, RMQ_SYS_TRANS_HALF_TOPIC QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, DefaultCluster_REPLY_TOPIC QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, BenchmarkTest QueueData [brokerName=broker-a, readQueueNums=1024, writeQueueNums=1024, perm=6, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, OFFSET_MOVED_EVENT QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, TopicTest QueueData [brokerName=broker-a, readQueueNums=4, writeQueueNums=6, perm=6, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, broker-a QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=7, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, TBW102 QueueData [brokerName=broker-a, readQueueNums=8, writeQueueNums=8, perm=7, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, SELF_TEST_TOPIC QueueData [brokerName=broker-a, readQueueNums=1, writeQueueNums=1, perm=6, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new topic registered, DefaultCluster QueueData [brokerName=broker-a, readQueueNums=16, writeQueueNums=16, perm=7, topicSynFlag=0]
    2020-02-07 22:56:24 INFO RemotingExecutorThread_1 - new broker registered, 192.168.0.105:10911 HAServer: 192.168.0.105:10912
    2020-02-07 22:56:30 INFO NettyServerCodecThread_2 - NETTY SERVER PIPELINE: channelRegistered 127.0.0.1:60561
    2020-02-07 22:56:30 INFO NettyServerCodecThread_2 - NETTY SERVER PIPELINE: channelActive, the channel[127.0.0.1:60561]
    

    可以从日志看到,broker在启动的时候确实会发送代码为103的网络请求,注册到 NameServer中,更新路由信息并且还创建了默认的一些topic

  • 服务删除
    服务删除其实就是讲某些失效的broker的相关路由信息从NameServer中删除,这样Producer和consumer就不会连接到错误的broker进行生产和消费了,在NameServer中有两种方式,进行服务踢出
    1.通过定时任务,如果一个broker在两分钟没有向NameServer注册,那么NameServer会自动踢出这个broker
    2.通过broker在停止服务的时候,broker会调用网络级别的接口通知注册过的NameServer,在这个接口中做相同处理,将关联这个的broker信息剔除
    在这里插入图片描述
    接收到104的网络请求调用,DefaultRequestProcessor调用unregisterBroker进行拆包处理
    在这里插入图片描述
    DefaultRequestProcessor的unregisterBroker直接委托给路由管理器处理RouteInfoManager
    在这里插入图片描述
    1.根据broker的服务地址删除相关的心跳信息
    2.一个brokerName对应的是一个master和多个slaver,这些broker都有一个唯一的BrokerId,直接根据brokerId删除对应的broker节点信息
    3.如果这个brokerName对应的broker都删除了,那么对应负载了的topic的队列也要进行移除,这样producer和consumer就不会连接到已经挂机的broker

  • 服务发现
    服务发现主要是提供给producer和consumer使用的,当需要网队列发消息时,是往一个主题发送,那么你需要知道往哪个broker发,这是就需要获取相关的路由信息,那么服务发现就是这么一个接口,根据topic获取路由信息。
    在这里插入图片描述
    流程差不多,肯定是委托到RouteInfoManager中获取相关路由信息供客户端(producer和consumer)使用

发布了65 篇原创文章 · 获赞 11 · 访问量 7132

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/104213890