RocketMQ生产者分析

NameService

1.1 总体架构

在这里插入图片描述

1.2 NameSev启动流程

在这里插入图片描述

1.3 路由管理

1.3.1 路由元数据

代码:org.apache.rocketmq.namesrv.routeinfo.RouteInfoManager

private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

topicQueueTable: topic消息队列路由信息,消息发送时根据路由表进行负载均衡

brokerAddrTable: Broker基本信息,包括brokerName,所属集群名称,主备Borker地址

clusterAddrTable: Broker集群信息,存储集群中所有Broker名称

brokerLiveTable: Broker状态信息,NameServer每次收到心跳包是会替换该信息

filterServerTable: Broker上的FilterServer列表,用于类模式消息过滤

RocketMQ基于发布订阅机制,一个Topic拥有多个消息队列,一个Broker为每个创建4个自读,4个只写队列,多个Broker组成一个集群,BrokerName由相同的多台Broker组成Master-Slave,borkerId为0代表Master,大于0为Slave。

brokerLiveInfo中的lastUpdateTimestamp存储上次接收心跳包的时间。

topicQueueTable:{   
  "topic1":[        
    {
      "brokerName":"broker-a",
      "readQueueNums":4,
      "writeQueueNums":4,
      "perm":6,         
      "topicSynFlag":0   // topic同步标记
    },{
      "brokerName":"broker-b",
      "readQueueNums":4,
      "writeQueueNums":4,
      "perm":6,         
      "topicSynFlag":0   // topic同步标记
    }
  ]
}
brokerAddrTable:{
  "broker-a":{
    "cluster":"c1",
    "brokerName":"broker-a",
    "brokerAddrs":{
      0:"192.168.32.1:10000",  // master
      1:"192.168.32.1:10000"   // slave
    }
  }
}
(1) broker发送心跳包

在这里插入图片描述

RockerMQ路由注册是通过Broker向NameServ发送心跳包实现,Broker启动时会向NameServ发送心跳信息,启动之后,Broker每个30秒向NameServ发送心跳包,NameServ收到心跳包会更新brokerLiveTable的缓存中BrokerLiveInfo中的lastUpdateTimestamp最后一个更新时间,NameServ每隔10s 扫描broker 路由信息,160秒没有上报信息将删除改路由信息。

(2) 注册路由信息

在这里插入图片描述

NameServ中DefaultRequestProcessor类中的processRequest接收所有请求,通过code分发到RouteInfoManager实现接收心跳信息,更新Table中数据。

1.3.4 路由删除

broker每个30秒向namesrv发送心跳包,心跳包包含brokerId,broker地址,broker名称,broker所属集群名称,broker关联的filterServer列表,但是Broker宕机,NameServ无法接收到心跳包,此时NameServ如何删除到broker?Name会每个10s扫描brokerLiveTable状态表,如果BrokerLive的lastUpdateTimestamp的时间戳距离当前时间超过120秒,则认为该broker失效,将会被删除,同时更新topicQueueTable,brokerAddrTable,brokerLiveTable,filterServerTable,clusterAddrTable。

RockerMQ有两种触发删除路由信息动作

  • NameServ定期扫描brokerLIveTable列表,距离上次上报时间超过120s,则删除

  • Broker正常关闭触发unregisterBroker

两种方式都是一样,就是从路由表中删除与该broker相关的信息

在这里插入图片描述

1.3.5 消息发现

路由消息发发生变更时,NameServ不会主动向客户端推送变更消息,需要客户端自己请求获取,org.apache.rocketmq.namesrv.processor.DefaultRequestProcessor#getRouteInfoByTopic。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值