Kafka重复消费问题是kafka中经典问题了,小伙伴们知道kafka重复消费是什么原因引起的吗?它又是怎么避免重复消费的呢?这次就来了解了解吧。
重复消费原因
根本原因就是“数据消费了,但offset无更新”!一般在如下情况会导致offset无更新。
max.poll.interval.ms
两次poll操作允许的最大时间间隔。单位毫秒。默认值300000(5分钟)。
两次poll超过此时间间隔,Kafka服务端会进行rebalance操作,导致客户端连接失效,无法提交offset信息,从而引发重复消费。
拿到消息就提交offset
1)、丢包问题:消息推送服务,每天清晨,手机上就会充斥着各路推送消息,这时流量剧增,就可能出现kafka发送数据过快,导致服务器网卡爆满,或磁盘处于繁忙状态,导致丢包现象的出现。
解决方法:首先对kafka进行限速, 其次启用重试机制,重试间隔时间设置长一些,最后Kafka设置acks=all,即需要相应的所有处于ISR的分区都确认收到该消息后,才算发送成功。
2)、重复消费最常见的原因:re-balance问题,通常会遇到消费的数据,处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会re-balance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。
避免重复消费
1)、kafka自带消费机制
Kafka是有offset的概念的,每个消息被写进去后,都会产生一个offset,代表他的序号,之后consumer消费该数据之后,隔一段时间,会把自己消费过的消息的offset提交一下,代表这个消息已经消费过了。下次我要是重启,就会继续从上次消费到的offset来继续消费。
但是当我们直接kill进程了,再重启。这会导致consumer有些消息处理了,但是没来得及提交offset。等重启之后,少数消息就会再次消费一次。
2)、通过保证消息队列消费的幂等性来保证
举个例子,当消费一条消息时就往数据库插入一条数据。如何保证重复消费也插入一条数据呢?
那么我们就需要从幂等性角度考虑了。幂等性,一般的说,就是一个数据或一个请求,无论来多少次,对应的数据都不会改变的,不能出错。
以上就是关于Kafka重复消费问题的所有内容,更多java常见问题及解决方法可以关注我们的网站来了解详情。
推荐阅读: