spring-kafka 重复消费数据

  • spring集成kafuka框架
  • 版本介绍
  • 解决方案


spring集成kafuka框架

最近公司需要对接kafka拉取数据,在使用spring-kafka框架时候,总是无法持续消费,总是出现持续消费,相当纠结。因为也是刚接手任务,故整理了一下遇到的难题,特此整理一下,望对各位同学有些帮助。

版本介绍

项目架构主要是spring mvc 架构版本是5.0.2.RELEASE版本,spring-kafka版本是2.1.0.RELEASE ,kafka-client的版本是1.0.0版本。

在消费数据的时,遇见如下异常错误信息:

springboot kafka消费两个topic springboot kafka 重复消费_数据


理解下来就是当kafka处理完500记录后去提交offset偏移量的时候,发现会话已经结束了,认为系统处理完成了,需要重新分配分区,在分区的时候出现了混乱,导致系统又要重新去消费已消费过的数据。重复消费数据。

MAX_POLL_INTERVAL_MS_CONFIG属性意思为kafka消费者在每一轮poll()调用之间的最大延迟,消费者在获取更多记录之前可以空闲的时间量的上限。这个参数不能跟 SESSION_TIMEOUT_MS_CONFIG时间数相同 需要比SESSION_TIMEOUT_MS_CONFIG时间要大些。

解决方案

随后根据业务处理的复杂程度以及耗时的长短做出了参数调整,

主要是配置consumerConfig对象,截图如下:

springboot kafka消费两个topic springboot kafka 重复消费_spring_02

主要注意的是需要将ENABLE_AUTO_COMMIT_CONFIG 提交改为false,借此转交给spring-kafka框架帮忙提交
offset偏移量,同时需要将SESSION_TIMEOUT_MS_CONFIG时间长度根据设置MAX_POLL_RECORDS_CONFIG的记录数来计算一个会话时长。最后进行平衡调整。

目前生产者传入2个队列,每个队列有5个分区,实时去推送数据。而对应消费者需要创建5个及以上的副本去消费数据。

目前只是针对一个topic队列做了副本增量。后续会对另一个topic队列做副本增量。

在经历了几点的数据跑试之后,目前发现录入数据库的效率非常缓慢,平均处理一条订单数据耗时在3s左右,实在不能忍受了,最后直接换了一个新库数据专门录入此库,效率非常明显了,房单数据堆积量已为0达到了实时同步,订单数据堆积量已剩下40万左右,可以在一天左右可以将堆积量消耗为0 。 讲这些的意思,这次的问题出现应该属于数据库达到瓶颈。需要从数据库吞吐量考虑程序效率问题。