解决Kafka重复消费问题

1.问题背景

某服务(用了SpringBoot + spring-kafka)处理Kafka消息时,发现每条消息处理时间长达60+秒。几百条消息处理完后,又重新从第一条开始重复消费。

2.原因分析

Kafka消费者有两个配置参数:

max.poll.interval.ms

两次poll操作允许的最大时间间隔。单位毫秒。默认值300000(5分钟)。

两次poll超过此时间间隔,Kafka服务端会进行rebalance操作,导致客户端连接失效,无法提交offset信息,从而引发重复消费。

max.poll.records

一次poll操作获取的消息数量。默认值50。

如果每条消息处理时间超过60秒,那么一批消息处理时间将超过5分钟,从而引发poll超时,最终导致重复消费。

3.对策分析

1)分析业务代码逻辑,进行性能优化,确保每条消息处理时间控制在合理范围

每条消息的处理时间不要超过5分钟。

如果超过5分钟,则考虑进行架构上的优化。

比如A线程消费消息,放到进程内部队列中,提交offset;其他线程从内部队列取消息,并处理业务逻辑。为防止内部队列消息积压,A线程需要监控队列中消息数量,超过一定量时进入等待。

2)适当增大max.poll.interval.ms的值

SpringBoot没有提供可调节此数值的参数。如果修改此数值,需要自己封装方法创建Kafka客户端:

org.apache.kafka.clients.consumer.KafkaConsumer.KafkaConsumer<String,String>(Properties)

 

3)适当减小max.poll.records的值

可通过SpringBoot配置参数"spring.kafka.consumer.max-poll-records"调整。

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值