4.3.2 心跳状态
每个消费者客户端都只有一个心跳任务,心跳对象(Heartbeat)除了记录心跳任务的元数据-一会话超时时间(timeout)、定时任务时间间隔(interval),还会记录当前心跳任务的状态一一最近的会话重置时间、最近的心跳发送时间、最近的心跳接收时间。相关代码如下:
timeToNextHeartbeat()方法会计算当前时间到下一次调度的时间间隔,它跟上一次心跳任务的发生时间有关,会用来判断什么时候可以发送下一次心跳:如果返回值为0,表示当前时间减去上一次调度时间的差距大于心跳间隔,需要立即发送下一次心跳;如果大于0,表示当前时间还没到达下一次调度时间,还需要多久才会发生下一次心跳。
如图4-33(上)所示,心跳间隔设置为5秒,上一次心跳的时间是0秒,下一次的心跳时间就是5秒。如果当前时间是2秒,它距离上次心跳时间才过去了2秒,还没到下次心跳的时间,方法返回值为3秒,表示再过3秒才会发生下一次心跳。如果当前时间是4秒,它距离上次心跳时间过去了4秒,也还没到下次心跳的时间,方法的返回值为1秒,表示再过1秒会发生下一次心跳。如图4-33(下)所示,本来应该在5秒发生的心跳因为某种原因没有执行(浅灰色圆圈)。轮询时的当前时间是6秒,距离上次心跳过去了6秒,超过心跳间隔,返回值为0秒,需要马上发生心跳。
实际上,在计算当前时间和距离上次心跳的时间(ti.meSi.nceLastHeartbeat)时,还会用到上一次会话的重置时间(lastSessi.onReset)。因为如果是客户端第一次启动,上次心跳是没有数据的,只能用上次的会话重置时间。