我目前正在运行kafka 0.10.0.1,并且相关的两个值的相应文档如下:
heartbeat.interval.ms - 使用Kafka 's group management facilities. Heartbeats are used to ensure that the consumer'会话时心跳与消费者协调员之间的预期时间保持活动状态,并在新消费者加入或离开群组时促进重新 balancer . 该值必须设置为低于session.timeout.ms,但通常应设置为不高于该值的1/3 . 它可以调整得更低,以控制正常重新 balancer 的预期时间 .
session.timeout.ms - 在会话超时期间未收到用于检测使用Kafka 's group management facilities. When a consumer'心跳的故障的超时,代理会将消费者标记为失败并重新 balancer 该组 . 由于仅在调用poll()时发送心跳,因此较高的会话超时允许更多时间在消费者的轮询循环中进行消息处理,但代价是检测硬故障的时间较长 . 另请参阅max.poll.records以获取另一个控制轮询循环中处理时间的选项 .
我不清楚为什么文档建议将 heartbeat.interval.ms
设置为 session.timeout.ms
的1/3 . 这些值是否相同是没有意义的,因为只有在调用 poll()
时才发送心跳,因此当处理当前记录时?
1 回答
代码设置了一个硬限制,你不能设置
heartbeat.interval.ms
不低于request.timeout.ms
,否则Kafka会抱怨"Heartbeat must be set lower than the session timeout" .如果你真的有这两个配置是相同的值,可能的情况是网络客户端永远不会心跳,因为会话超时几乎总是在做心跳之前发生 .
至于1/3,我更愿意认为它是一种启发式 Value .