我正在使用kafka 0.10.1.1并与以下3个属性混淆。
heartbeat.interval.ms
session.timeout.ms
max.poll.interval.ms
heartbeat.interval.ms - 这是在0.10.1中添加的,它将在民意调查之间发送心跳。 session.timeout.ms - 这是为了在没有对kafka的请求时开始重新平衡,并且每次轮询都会重置它。 max.poll.interval.ms - 这是在整个民意调查中。
但是,卡夫卡何时开始重新平衡?为什么我们需要这3个?所有这些的默认值是什么?
由于
答案 0 :(得分:20)
假设我们正在讨论Kafka 0.10.1.0或更高版本,其中每个消费者实例使用两个线程来运行。一个是调用poll
的用户线程;另一个是心跳线,专门处理心跳事。
session.timeout.ms
用于心跳线程。如果协调器在此时间间隔过去之前未能从消费者那里获得任何心跳,则会将消费者标记为失败并触发新一轮的重新平衡。
max.poll.interval.ms
用于用户线程。如果消息处理逻辑太重而不能花费大于此时间间隔的成本,协调器明确让消费者离开该组并触发新一轮的重新平衡。
heartbeat.interval.ms
用于让其他健康消费者更快地意识到重新平衡。如果协调器触发重新平衡,则其他消费者只会通过接收包含REBALANCE_IN_PROGRESS
异常的心跳响应来了解此情况。更快地发送心跳请求,消费者知道它需要更快地重新加入该组。
建议值:
session.timeout.ms
:相对较低的值,例如10秒
max.poll.interval.ms
:根据您的处理要求而定
heartbeat.interval.ms
:相对较低的值,更好session.timeout.ms
答案 1 :(得分:1)
只是让它们更加清晰,一个心跳线程(连同在同一进程中调用Poll
函数的用户线程)将在每“ heartbeat.interval.ms”时间将心跳发送给协调器,并且协调器将标记如果用户线程中的使用者超过了“ session.timeout.ms”或“ max.poll.interval.ms”,则视为死者。
答案 2 :(得分:0)
session.timeout.ms与heartbeat.interval.ms密切相关。
heartbeat.interval.ms 控制KafkaConsumer poll()方法向组协调器发送心跳的频率,而 session.timeout.ms 控制消费者可以放心而不必动。
因此,通常将这两个属性一起修改。 heatbeat.interval.ms必须小于session.timeout.ms,通常设置为超时值的三分之一。因此,如果session.timeout.ms为3秒,则heartbeat.interval.ms应该为1秒。
max.poll.interval.ms -使用使用者组管理时,两次poll()调用之间的最大延迟。 这为使用者在获取更多记录之前可以处于空闲状态的时间设置了上限。如果在此超时到期前未调用poll(),则认为使用方失败,该组将重新平衡以将分区重新分配给另一个成员