1.需求:近来有小伙伴反应他负责的那块服务出现了kafka消息重复消费的问题。
2.解决:
出现重复消费的原因:消费者(consumer)依据偏移量(offset)读取消息, 消费完消息后,会向kafka的节点(broker) 发送一个消息被消费的反馈,也就是提交该消息的偏移量,然后broker更新对应消息的consumer_offset中,接着等待下个消费者依据偏移量读取消息。
消费者提交offset的默认时间是5分钟,超过这个时间,若有别的消费者请求消息,就会形成重复消费。
方法1:修改微服务关于消费者参数-每次消费者拉取(poll)消息的条数(默认500)
spring.kafka.consumer.max-poll-records
方法2:延长微服务关于消费者参数-提交offset的时间(默认5分钟)
spring.kafka.properties.max.poll.interval.ms
方法3:修改业务逻辑,提高消费者消费能力
#默认500
spring.kafka.consumer.max-poll-records=100
#默认300000,单位毫秒
spring.kafka.properties.max.poll.interval.ms=600000
spring:
kafka:
consumer:
max-poll-records: 100
properties:
max:
poll:
interval:
ms: 600000