Kafka 消费者配置中 heartbeat.interval.ms 和 session.timeout.ms 之间的区别
Difference between heartbeat.interval.ms and session.timeout.ms in Kafka consumer config
我目前是运行 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()
时发送,因此在处理当前记录时才发送?
代码做了一个硬限制,你不能设置heartbeat.interval.ms
不少于request.timeout.ms
,否则Kafka报错"Heartbeat must be set lower than the session timeout"。
如果您真的将这两个配置设置为相同的值,可能的情况是网络客户端将不再心跳,因为会话超时几乎总是在执行心跳之前发生。
至于 1/3,我更愿意认为它是一种启发式值。
heartbeat.interval.ms
指定消费者发送心跳信号的频率。所以如果这是 3000 毫秒(默认值),那么每 3 秒消费者就会向代理发送心跳信号。
session.timeout.ms
指定代理需要从消费者那里获得至少一个心跳信号的时间量。否则它会将消费者标记为已死。默认值 10000 毫秒(10 秒)规定在代理将消费者标记为已死亡之前丢失三个心跳信号。
在负载较重的网络设置中,丢失少量心跳信号是正常的。所以建议等待丢失3个心跳信号后再将消费者标记为死亡。这就是 1/3 推荐的原因。
heartbeat.interval.ms
是消费者向 kafka broker 发送信号以表明它处于活动状态的持续时间,session.timeout.ms
是 kafka broker 在没有接收到来自消费者的心跳的情况下可以等待的最长时间,如果 session.timeout.ms
持续时间超过而没有收到来自消费者的心跳,消费者将被标记为死亡(i.e.it 不能再消费消息)。在一个每天处理数百万条消息的 kafka 队列中,可以有更多 session.timeout.ms
持续时间,比如高达 30000 毫秒(默认为 10 秒),以在处理大量消息时保持消费者存活。
我目前是运行 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()
时发送,因此在处理当前记录时才发送?
代码做了一个硬限制,你不能设置heartbeat.interval.ms
不少于request.timeout.ms
,否则Kafka报错"Heartbeat must be set lower than the session timeout"。
如果您真的将这两个配置设置为相同的值,可能的情况是网络客户端将不再心跳,因为会话超时几乎总是在执行心跳之前发生。
至于 1/3,我更愿意认为它是一种启发式值。
heartbeat.interval.ms
指定消费者发送心跳信号的频率。所以如果这是 3000 毫秒(默认值),那么每 3 秒消费者就会向代理发送心跳信号。
session.timeout.ms
指定代理需要从消费者那里获得至少一个心跳信号的时间量。否则它会将消费者标记为已死。默认值 10000 毫秒(10 秒)规定在代理将消费者标记为已死亡之前丢失三个心跳信号。
在负载较重的网络设置中,丢失少量心跳信号是正常的。所以建议等待丢失3个心跳信号后再将消费者标记为死亡。这就是 1/3 推荐的原因。
heartbeat.interval.ms
是消费者向 kafka broker 发送信号以表明它处于活动状态的持续时间,session.timeout.ms
是 kafka broker 在没有接收到来自消费者的心跳的情况下可以等待的最长时间,如果 session.timeout.ms
持续时间超过而没有收到来自消费者的心跳,消费者将被标记为死亡(i.e.it 不能再消费消息)。在一个每天处理数百万条消息的 kafka 队列中,可以有更多 session.timeout.ms
持续时间,比如高达 30000 毫秒(默认为 10 秒),以在处理大量消息时保持消费者存活。