简介
由于项目中需要使用kafka作为消息队列,并且项目是基于spring-boot来进行构建的,所以项目采用了spring-kafka作为原生kafka的一个扩展库进行使用。先说明一下版本:
spring-boot 的版本是1.4.0.RELEASE
kafka 的版本是0.9.0.x 版本
spring-kafka 的版本是1.0.3.RELEASE
用过kafka的人都知道,对于使用kafka来说,producer的使用相对简单一些,只需要把数据按照指定的格式发送给kafka中某一个topic就可以了。本文主要是针对spring-kafka的consumer端上的使用进行简单一些分析和总结。
kafka的速度是很快,所以一般来说producer的生产消息的逻辑速度都会比consumer的消费消息的逻辑速度快。
具体案例
之前在项目中遇到了一个案例是,consumer消费一条数据平均需要200ms的时间,并且在某个时刻,producer会在短时间内产生大量的数据丢进kafka的broker里面(假设平均1s中内丢入了5w条需要消费的消息,这个情况会持续几分钟)。
对于这种情况,kafka的consumer的行为会是:
kafka的consumer会从broker里面取出一批数据,�给消费线程进行消费。
由于取出的一批消息数量太大,consumer在session.timeout.ms时间之内没有消费完成
consumer coordinator 会由于没有接受到心跳而挂掉,并且出现一些日志
日志的意思大概是coordinator挂掉了,然后自动提交offset失败,然后重新分配partition给客户端

在Spring-Kafka项目中遇到kafka消费延迟和重复消费的问题,原因是consumer消费速度跟不上producer的生产速度。解决方案包括增加partition数量、使用阻塞队列和工作线程池提高并行消费能力,以及关闭自动提交offset,改用Spring-Kafka的提交策略。关闭auto-commit后,Spring-Kafka启动invoker线程,从内部队列消费并确保在处理完数据后再提交offset,防止重复消费。此外,调整session.timeout.ms和减少单次拉取数据量也可改善消费效率。
最低0.47元/天 解锁文章
2849

被折叠的 条评论
为什么被折叠?



