实现要点:根据key获取WatchList,然后从获取的WatchList中内部的ConcurrentMap中再按照Key获取对应与当前消费者对应的Watch。
-
如果没有找到对应消费者的Watch,则直接返回,无需检测,说明已经成功检测。
-
如果找到了对应消费者的Watch,则执行被watch的tryCompleteWatched方法。
Watch的数据结构如下:
接下来重点关注Watches的tryCompleteWatched方法,该方法的详细调用代码如下图所示:
这边先重点介绍一下组协调器判断一次成功的心跳检测的三个标准中满足一个即可(GroupCoordinator的tryCompleteHeartbeat方法):
-
如果消费组的状态处于Dead
-
如果消费组的状态为Pending(消费组在重平衡中)
-
hearbeatSatisfied为true,即收到了一个有效的心跳包。
上述代码的实现比较简单,这里就不一一罗列,其核心关键点如下:
-
删除对应的Watch,表示一次心跳检测成功。
-
Watchs中存储的对象是DelayedOperation(Kafka延迟类型的父类)的子类,在心跳检测中具体为DelayedHeartbeat。
-
最终执行DelayedOperation的是TimeTask的cancel方法(取消延迟任务),就是从延迟调度中移除自己,表示没有超时,结束本轮的超时检测,具体的存储结构,将在下文详介绍如果开启新一轮心跳检测时再详细讲解。
为了方便大家阅读源码,其主要的调用时序图如下:
1.2.2 开启下一轮心跳检测
===========