自身处理:幂等性+事务+ACKS=-1 ===>精准一次性消费
kafka在0.11版新增了幂等型producer和事务型producer。前者解决了单会话幂等性等问题,后者解决了多会话幂等性
幂等性: 支持单分区单会话, 分区内数据有序,对照id, 数据有唯一id存在不发送
事务: 支持多分区, 数据有唯一id, 和所有分区中比较, 如果存在不发送, 效率低下 (生产环境较少使用, 容易数据挤压, 应更追求效率)
造成Kafka重复消费的原因:
底层最根本的原因是:已经消费了数据,但是offset并没及时提交(或者压根没提交)
导致的原因很多,常见原因:
1、强行kill线程,导致消费后的数据,offset没有提交
2、设置了offset为自动提交,在关闭kafka时,如果在close之前,调用consumer.unsubscribe()则可能有部分offset没提交,下次重启会重复消费
3、消费后的数据,当ooset还没有提交时,partition就断开连接.eg:通常会遇到消费的数据,处理很好使,导致超过了kafka的会话时间-session timeout时间(0.10.x版本默认会话时间是30s),那么久会reblance重平衡,此时有一定几率offset没提交,会导致重平衡后的重复消费.
4、当消费者重新分配partition的时候,可能出现从头开始消费的情况,最终导致重发问题
5、当消费者消费的速度很慢的时候,可能在一个会话周期内还未完成,导致心跳机制检测报告出现问题
常见解决办法:
1.手动维护offset
2.加大会话时间参数--kafka.consumer.session.timeout,以避免被错误关闭的情况产生
3.加大消费者的消费速率(消费能力)
4.在下游对数据进行去重操作