我目前正在运行kafka 0.10.0.1,这两个值对应的文档如下:
heartbeat.interval.ms—使用kafka的组管理设施时,消费者协调员的预期心跳间隔时间。心跳用于确保消费者的会话保持活跃,并在新消费者加入或离开组时促进重新平衡。该值必须设置为低于session.timeout.ms,但通常不应高于该值的1/3。它可以调整得更低,以控制正常再平衡的预期时间。
session.timeout.ms—使用kafka的组管理工具时用于检测失败的超时。当在会话超时时间内未收到使用者的心跳信号时,代理会将该使用者标记为失败并重新平衡组。由于只有在调用poll()时才会发送心跳,因此较高的会话超时允许在使用者的poll循环中有更多的时间进行消息处理,而代价是检测硬故障的时间较长。另请参阅max.poll.records以获取控制轮询循环中处理时间的另一个选项。
我不清楚为什么医生建议设置 heartbeat.interval.ms
至1/3 session.timeout.ms
. 因为心跳信号只有在 poll()
调用,从而在当前记录的处理完成时调用?
3条答案
按热度按时间pzfprimi1#
heartbeat.interval.ms
是消费者向Kafka经纪人发送信号以表明其活动的持续时间,session.timeout.ms
是kafka代理在没有从使用者接收心跳信号的情况下可以等待的最长持续时间,如果session.timeout.ms
持续时间超过而未从使用者接收到心跳,则该使用者将被标记为已死亡(即,它不能再使用消息)。在Kafka队列中,每天处理的数百万条消息可能会有更多session.timeout.ms
持续时间高达30000ms(默认值为10s),以保持消费者在处理大量数据时的活力。yh2wf1be2#
这个代码有一个你不能设置的硬限制
heartbeat.interval.ms
不少于request.timeout.ms
,否则kafka会抱怨“心跳必须设置为低于会话超时”。如果您真的让这两个配置的值相同,那么可能的情况是网络客户端将不再心跳,因为会话超时几乎总是发生在执行心跳之前。
至于1/3,我更倾向于认为它是一个启发性的值。
v2g6jxz63#
这个
heartbeat.interval.ms
指定使用者发送心跳信号的频率。因此,如果这是3000毫秒(默认值),那么每3秒消费者就会向代理发送心跳信号。这个
session.timeout.ms
指定代理需要从使用者获取至少一个心跳信号的时间量。否则它会将消费者标记为死亡。默认值10000毫秒(10秒)规定在经纪人将消费者标记为死亡之前丢失三个心跳信号。在高负荷的网络环境中,丢失少量的心跳信号是很正常的。因此,建议在将消费者标记为死亡之前,等待丢失3个心跳信号。这就是三分之一建议的理由。