工作中,经常会给kafka配置以下参数:
request.timeout.ms 60 * 1000 * 4
max.poll.interval.ms 60 * 1000 * 6
session.timeout.ms 60 * 1000 * 3
heartbeat.interval.ms 60 * 1000 * 2
- session.timeout.ms: 检查整个消费者死亡超时时间
- heartbeat.interval.ms: 心跳检查超时时间,但通常应设置为不高于session.timeout.ms的1/3
- max.poll.interval.ms: 检查消费者处理线程死亡
- request.timeout.ms: 请求超时时间,和上面三个没有依赖关系
在kafka0.10.1 之前:
- 检查整个消费者死亡和检查消费则处理线程,使用的同一个线程,如果设置的max.poll.interval.ms大于session.timeout.ms,遇到一个处理时间过长的消息,会由于线程忙于处理消息,而无法发送心跳,导致kafka认为改消费则已完全死亡,进而进行Rebalance
- 所以推荐设置:heartbeat.inerval.ms < max.poll.interval.ms < session.timeout.ms
在kafka0.10.1之后:
- session.timeout.ms 和 max.poll.interval.ms 解耦了,拆成了两个线程,不用再担心它们之间的依赖关系
- 推荐设置:heartbeat.interval.ms < session.timeout.ms