就在今天早上发现推送连续推了几条重复的消息,于是就仔细地查阅了下kafka相关配置,大概如下:
kafka:
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
batch-size: 1000
buffer-memory: 524288
retries: 0
acks: -1
consumer:
# group-id: consumer-tutorial-${server.port}
group-id: consumer-tutorial
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
auto-offset-reset: earliest
enable-auto-commit: true
消费使用地是默认值,自动提交,间隔时间也没有设置(其实之前别人设置了,auto-commit-interval-ms,但这个属性在SpringBoot配置中并不存在,而是auto-commit-interval。也就是说之前设置的都是错误的,没有起作用)。我在本地做测试也没发现问题,没办法就分析了下日志,发现消费端从接收到业务处理完花了好几分钟(说到这里,我原先以为kafka自动提交点是在消费端一接收到消息时就提交,但是并不是这样的)。于是,我就试着在本地做延时操作,分别试了延迟2分钟、3分钟、5分钟。当我延时了5分钟的时候,就出现消费端重复消费的问题。那么问题就很明显了,就是因为消费端不是在一收到消息就提交,而是在整个业务完成之后才提交的。
另外,说一下,我使用的时Spring提供的@KafkaListener来监听。