Kafka的心跳处理机制用到了时间轮算法,Java开发经验的有效总结

实现要点:根据key获取WatchList,然后从获取的WatchList中内部的ConcurrentMap中再按照Key获取对应与当前消费者对应的Watch。

  • 如果没有找到对应消费者的Watch,则直接返回,无需检测,说明已经成功检测。

  • 如果找到了对应消费者的Watch,则执行被watch的tryCompleteWatched方法。

Watch的数据结构如下:

Kafka的心跳处理机制竟然用到了时间轮算法?

接下来重点关注Watches的tryCompleteWatched方法,该方法的详细调用代码如下图所示:

Kafka的心跳处理机制竟然用到了时间轮算法?

这边先重点介绍一下组协调器判断一次成功的心跳检测的三个标准中满足一个即可(GroupCoordinator的tryCompleteHeartbeat方法):

  • 如果消费组的状态处于Dead

  • 如果消费组的状态为Pending(消费组在重平衡中)

  • hearbeatSatisfied为true,即收到了一个有效的心跳包。

上述代码的实现比较简单,这里就不一一罗列,其核心关键点如下:

  • 删除对应的Watch,表示一次心跳检测成功。

  • Watchs中存储的对象是DelayedOperation(Kafka延迟类型的父类)的子类,在心跳检测中具体为DelayedHeartbeat。

  • 最终执行DelayedOperation的是TimeTask的cancel方法(取消延迟任务),就是从延迟调度中移除自己,表示没有超时,结束本轮的超时检测,具体的存储结构,将在下文详介绍如果开启新一轮心跳检测时再详细讲解。

为了方便大家阅读源码,其主要的调用时序图如下:

Kafka的心跳处理机制竟然用到了时间轮算法?

1.2.2 开启下一轮心跳检测

===========

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值