代码很少,却很优秀!RocketMQ的NameServer是如何做到的?
2024-06-14 08:48:57 软件 129观看
摘要今天我们来一起深入分析 RocketMQ的注册中心 NameServer。本文基于 RocketMQ release-5.2.0。首先,我们回顾下 RocketMQ的内核原理鸟瞰图:从上面的鸟瞰图,我们可以看出:Nameserver既和 Broker交互,也和 Producer和 Consume

今天我们来一起深入分析 RocketMQ的注册中心 NameServer。bDd28资讯网——每日最新资讯28at.com

本文基于 RocketMQ release-5.2.0。bDd28资讯网——每日最新资讯28at.com

首先,我们回顾下 RocketMQ的内核原理鸟瞰图:bDd28资讯网——每日最新资讯28at.com

bDd28资讯网——每日最新资讯28at.com

bDd28资讯网——每日最新资讯28at.com

三、心跳机制

心跳机制是 NameServer维护 Broker的路由信息最重要的一个抓手,主要分为接收心跳、处理心跳、心跳超时 3部分:bDd28资讯网——每日最新资讯28at.com

1.接收心跳

Broker每 30s会向所有的 NameServer发送心跳包,告诉它们自己还存活着,从而更新自己在 NameServer的状态,整体交互如下图:bDd28资讯网——每日最新资讯28at.com

bDd28资讯网——每日最新资讯28at.com

2.处理心跳

NameServer收到心跳包时会更新 brokerLiveTable缓存中 BrokerLiveInfo的 lastUpdateTimeStamp信息,整体交互如下图:bDd28资讯网——每日最新资讯28at.com

bDd28资讯网——每日最新资讯28at.com

处理逻辑可以参考源码:org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#processRequest#brokerHeartbeat:bDd28资讯网——每日最新资讯28at.com

public RemotingCommand brokerHeartbeat(ChannelHandlerContext ctx,    RemotingCommand request) throws RemotingCommandException {    final RemotingCommand response = RemotingCommand.createResponseCommand(null);    final BrokerHeartbeatRequestHeader requestHeader =        (BrokerHeartbeatRequestHeader) request.decodeCommandCustomHeader(BrokerHeartbeatRequestHeader.class);    this.namesrvController.getRouteInfoManager().updateBrokerInfoUpdateTimestamp(requestHeader.getClusterName(), requestHeader.getBrokerAddr());    response.setCode(ResponseCode.SUCCESS);    response.setRemark(null);    return response;}

3.心跳超时

NameServer每隔 10s(每隔5s + 5s延迟)扫描 brokerLiveTable检查 Broker的状态,如果在 120s内未收到 Broker心跳,则认为 Broker异常,会从路由表将该 Broker摘除并关闭 Socket连接,同时还会更新路由表的其他信息,整体交互如下图:bDd28资讯网——每日最新资讯28at.com

bDd28资讯网——每日最新资讯28at.com

private void startScheduleService() {this.scanExecutorService.scheduleAtFixedRate(NamesrvController.this.routeInfoManager::scanNotActiveBroker,        5, this.namesrvConfig.getScanNotActiveBrokerInterval(), TimeUnit.MILLISECONDS);}

源码参考:org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager#unRegisterBroker(),核心流程:bDd28资讯网——每日最新资讯28at.com

  • 遍历brokerAddrTable
  • 遍历broker地址
  • 根据 broker地址移除 brokerAddr
  • 如果当前 Topic只包含待移除的 Broker,则移除该 Topic

四、其他核心源码解读

NameServer启动

NameServer的启动类为:org.apache.rocketmq.namesrv.NamesrvStartup,整个流程如下图:bDd28资讯网——每日最新资讯28at.com

bDd28资讯网——每日最新资讯28at.com

NameServer启动最核心的 3个事情是:bDd28资讯网——每日最新资讯28at.com

  • 加载配置:NameServerConfig、NettyServerConfig主要是映射配置文件,并创建 NamesrvController。
  • 启动 Netty通信服务:NettyRemotingServer是 NameServer和Broker,Producer,Consumer通信的底层通道 Netty服务器。
  • 启动定时器和钩子程序:NameServerController实例一方面处理 Netty接收到消息后,一方面内部有多个定时器和钩子程序,它是 NameServer的核心控制器。

五、总结

NameServer并没有采用复杂的分布式协议来保持数据的一致性,而是采用 CAP理论中的 AP,各个节点之间是Peer to Peer的对等关系,数据的一致性通过心跳机制,定时器,延时感知来完成。bDd28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-93682-0.html代码很少,却很优秀!RocketMQ的NameServer是如何做到的?

声明:本网页内容旨在传播知识,不代表本站观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。

显示全文

上一篇:React 实现给密码输入框加上【密码强度】展示?

下一篇:建议直接收藏的三个 Go 库

最新热点