一.问题描述
kafka出现重复消费的问题,一条传入kafka中的消息可能被消费好几次。而且服务器出现以下日志:
二.问题原因分析以及解决方案
原因1:
消费端的能力过于低下。消息处理完之后提交下一个消费的offset,但是在session-time-out前,消息还没有处理完,出现了超时问题。于是被kafka视为消费失败了,导致一直重复消费。
解决方法1:
(1)关闭spring-kafka的自动提交。
spring.kafka.consumer.enable-auto-commit=false
(2)延长session-time-out的时间和poll的数据的数量。
#一次调用poll()操作时返回的最大记录数,默认值为500
spring.kafka.consumer.max-poll-records=500
#轮询消费者时使用的超时(以毫秒为单位,默认值是10s)
spring.kafka.listener.poll-timeout=10000;
原因2:
如果是使用的spring-kakfa的话,可能是由于kafka、springboot、spring-kakfa的版本不兼容。
apache的版本文档为:
https://cwiki.apache.org/confluence/display/KAFKA/Compatibility+Matrix
spring-kafka的文档为:
https://spring.io/projects/spring-kafka
重点信息如下:
- kafka2.2.1-2.3.0支持的kafka.client版本为0.11.0.x,所以要是用的spring-kakfa版本为1.3.x以上的版本,否则可能会出现问题,例如上面的重复消费的问题。
- spring boot 1.5的自动配置的kafka版本为1.1.x,但是应该用1.3.x,所以需要我们进行手动配置依赖版本。
- spring kafka 在1.3之后才支持一个 topic 可以由多个 group-id订阅,版本过低的化就会出现group-id无法加入,从而无法提交偏移量,造成重复消费。
总结:使用对应版本的spring-kafka,最好使用1.3.x以上版本。