kafka重复消费(总结)
- 根本原因
- 解决方法
- 关键参数配置
根本原因
已经消费的数据,但是offset没有成功提交
具体情况:
- 消费者宕机、重启,导致消息已经消费但是未提交offset。
- 消费者处理比较耗时,一次poll的数据,在max.poll.interval.ms达到最大值后仍未完成,未提交offest,触发rebalance。
- 消费者使用自动提交offset,但当还没有到auto.commit.interval.ms的时间,没来的及提交。有新的消费者加入或者移除,发生了rebalance。
- 超过session.timeout.ms的时间未发送心跳包,集群认为consumer宕机,触发rebalance,一般为网络问题。
解决方法
如下几种:
- 根据每条消息的平均处理时长,减少每次poll的个数。
- 提高max.poll.interval.ms的值。
- 给每个消息添加唯一索引,缓存消费过的消息id。
- consumer异步处理消息。
关键参数配置
max.poll.records
consumer每次poll的条数。
默认500条
max.poll.interval.ms
两次调用poll取数据的最大延迟时间,超过这个时间消费组会发生rebalance。
默认5分钟
heartbeat.interval.ms
consumer发送心跳包的间隔。
默认3秒
session.timeout.ms
consumer发送心跳包的超时时间。
默认10秒
enbale.auto.commit
是否自动提交offset。
默认为true
auto.commit.interval.ms
当enbale.auto.commit参数设置为 true 时才生效,表示开启自动提交消费位移功能时自动提交消费位移的时间间隔。
默认5秒
参考链接:
kafka重复消费
重复消费解决办法
重要参数配置