分布式消息队列RocketMQ源码分析之2 -- Broker与NameServer心跳机制
来源:互联网 发布:安卓版游戏制作软件 编辑:程序博客网 时间:2024/05/21 18:40
我们知道,Kafka是通过ZK的临时节点来监测Broker的死亡的。当一个Broker挂了之后,ZK上面对应的临时节点被删除,同时其他Broker收到通知。
那么在RocketMQ中,对应的NameServer是如何判断一个Broker的死亡呢?
NameSrv监测Broker的死亡
机制之一:监测连接断掉
当Broker和NameSrv之间的长连接断掉之后,下面的ChannelEventListener里面的函数就会被回调,从而触发NameServer的路由信息更新。
这里的ChannelEventListener是RocketMQ封装Netty向外暴露的一个接口层。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
机制之二:心跳
首先,每个Broker会每隔30s向NameSrv更新自身topic信息
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
NameServer收到RegisterBroker信息,更新自己的brokerLiveTable结构
- 1
- 1
然后NameServer会每10s,扫描一次这个结构。如果发现上次更新时间距离当前时间超过了BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2(2分钟),则认为此broker死亡。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
Producer/Consumer如何得知Broker死亡
当某个Broker死亡之后,NameSrv并不会主动通知Producer和Consumer。
而是Producer/Consumer周期性的去NameSrv取。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
这里的pollNameServerInteval默认是30s。这也就是意味着,默认情况下,当某个Broker挂了之后,Client需要30s的延迟才会得知此消息。
0 0
- 分布式消息队列RocketMQ源码分析之2 -- Broker与NameServer心跳机制
- 分布式消息队列RocketMQ源码分析之2 -- Broker与NameServer心跳机制
- 分布式消息队列RocketMQ源码分析之2 -- Broker与NameServer心跳机制
- RocketMQ源码分析之NameServer
- 分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
- 分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
- 分布式消息队列RocketMQ源码分析之3 -- Consumer负载均衡机制 -- Rebalance
- 分布式消息队列RocketMQ源码分析之1 -- Topic路由数据结构解析 -- topicRoute与topicPublishInfo与queueId
- 分布式消息队列RocketMQ源码分析之1 -- Topic路由数据结构解析 -- topicRoute与topicPublishInfo与queueId
- 分布式消息队列RocketMQ源码分析之1 -- Topic路由数据结构解析 -- topicRoute与topicPublishInfo与queueId
- 分布式消息队列RocketMQ源码分析之4 -- Consumer负载均衡与Kafka的Consumer负载均衡之不同点
- 分布式消息队列RocketMQ源码分析之4 -- Consumer负载均衡与Kafka的Consumer负载均衡之不同点
- 分布式消息队列RocketMQ源码分析之4 -- Consumer负载均衡与Kafka的Consumer负载均衡之不同点
- RocketMQ源码分析之Broker概述与同步消息发送原理与高可用设计及思考
- 分布式消息队列RocketMQ与Kafka架构上的巨大差异之2 -- CommitLog与ConsumeQueue
- 分布式消息队列RocketMQ与Kafka架构上的巨大差异之2 -- CommitLog与ConsumeQueue
- 分布式消息队列RocketMQ与Kafka的18项差异之“拨乱反正“之2
- 分布式消息队列RocketMQ与Kafka的18项差异之“拨乱反正“之2
- JVM、JRE和JDK简单了解
- Maven基础
- 计算给定日期增加自然月后的日期
- Python学习笔记
- HDU 2571 命运(DP)
- 分布式消息队列RocketMQ源码分析之2 -- Broker与NameServer心跳机制
- Android中的Context
- metadata远程存储和hive.metastore.local属性的说明
- uva11300分金币 随机选择算法
- js实现页面动态时间,滚动效果(年月日,小时、分钟、秒,星期,毫秒)
- InetAddressSocket使用总结
- 分布式消息队列RocketMQ源码分析之4 -- Consumer负载均衡与Kafka的Consumer负载均衡之不同点
- JDBC 第2篇
- 二叉树的最长路径