我目前正在运行kafka 0.10.0.1,有关这两个值的相应文档如下:
heartbeat.interval.ms - 使用Kafka集团管理设施时,心跳与消费者协调员之间的预计时间。心跳用于确保消费者的会话保持活动并且在新消费者加入或离开该组时促进再平衡。该值必须设置为低于session.timeout.ms,但通常应设置为不高于该值的1/3。它可以调整得更低,以控制正常重新平衡的预期时间。
session.timeout.ms - 用于在使用Kafka的组管理工具时检测故障的超时。当在会话超时内未收到消费者的心跳时,代理会将消费者标记为失败并重新平衡该组。由于仅在调用poll()时发送心跳,因此较高的会话超时允许更多时间在消费者的轮询循环中进行消息处理,代价是检测硬故障的时间较长。另请参阅max.poll.records以获取另一个控制轮询循环中处理时间的选项。
我不清楚为什么文档建议将heartbeat.interval.ms
设置为session.timeout.ms
的1/3。将这些值设置为相同是没有意义的,因为心跳仅在调用poll()
时发送,因此在处理当前记录时是否会发送?
答案 0 :(得分:1)
代码设置了一个硬限制,你不能设置heartbeat.interval.ms
不小于request.timeout.ms
,否则Kafka会抱怨“必须将Heartbeat设置为低于会话超时”。
如果你真的有这两个配置是相同的值,可能的情况是网络客户端永远不会心跳,因为会话超时几乎总是在做心跳之前发生。
至于1/3,我更愿意认为它是一种启发式价值。
答案 1 :(得分:1)
heartbeat.interval.ms指定用户发送心跳信号的频率。因此,如果这是3000毫秒(默认值),那么消费者将每3秒钟将心跳信号发送给代理。 session.timeout.ms指定经纪人需要从消费者那里获得至少一个心跳信号的时间量。否则,它将标记消费者已死亡。默认值10000毫秒(10秒)可在经纪人将消费者标记为死亡之前丢失三个心跳信号。在高负载的网络设置中,通常会丢失一些心跳信号。因此建议在将消费者标记为死亡之前等待丢失3个心跳信号。这就是1/3建议的原因。
答案 2 :(得分:0)
heartbeat.interval.ms
是消费者向kafka经纪人发送信号以表明其还活着的持续时间,session.timeout.ms
是kafka经纪人在没有收到消费者心跳的情况下可以等待的最大持续时间,如果{{1 }}持续时间超过了没有从消费者那里收到心跳的时间,那么该消费者将被标记为已死(即,它无法再消费消息)。在卡夫卡队列中,一天要处理数百万条消息的session.timeout.ms
持续时间可能会更长,例如长达30000ms(默认为10s),以使消费者在处理大量消息时保持生命。