Kafka重复消费,不丢失数据

kafka0.11.0.0版本正式支持精确一次处理语义exactly once semantic–EOS
kafka幂等性参考
1)幂等producer 保证单个分区的只会发送一次,不会出现重复消息
2)事务(transation):保证原子性的写入多个分区,即写入到多个分区的消息要么全部成功,要么全部回滚
3)流式EOS:流处理本质上可看成是“”读取-处理-写入的管道“”。此EOS保证整个过程的操作是原子性。注意,只使用kafka Stream

  1. https://blog.csdn.net/qq_35078688/article/details/86082858
  2. https://www.cnblogs.com/jingangtx/p/11330338.html

1.如何解决重复消费

重复问题:rebalance问题,
1.通常会遇到消费的数据处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会rebalance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。
2.或者关闭kafka时,如果在close之前,调用consumer.unsubscribe()则可能有部分offset没提交,下次重启会重复消费。
3.消费程序和业务逻辑在一个线程,导致offset提交超时。

try {
consumer.unsubscribe();
} catch (Exception e) {
}

try {
consumer.close();
} catch (Exception e) {
}
 

解决方法
配置解决:offset自动提交为false!
业务逻辑解决:自己提交偏移量,让consumer逻辑幂等
启用幂等producer:在producer程序中设置属性enabled.idempotence=true,若要实现多分区上的原子性,需要引入事务,启用事务支持:在producer程序中设置属性transcational.id为一个指定字符串(你可以认为这是你的额事务名称,故最好七个有意义的名字),同时设置enable.idempotence=true
幂等实现业务实现参考 https://www.cnblogs.com/huiandong/p/9402409.html

2.如何不丢失数据

生产者数据不丢失
同步模式:配置=1(只有Leader收到,-1所有副本成功,0不等待)。leader partition挂了,数据就会丢失。
解决:设置为-1保证produce写入所有副本算成功
          producer.type=sync
          request.required.acks=-1
异步模式,当缓冲区满了,如果配置为0(没有收到确认,一满就丢弃),数据立刻丢弃
解决:不限制阻塞超时时间。就是一满生产者就阻塞
          producer.type=async
          request.required.acks=1
          queue.buffering.max.ms=5000
          queue.buffering.max.messages=10000
          queue.enqueue.timeout.ms = -1
          batch.num.messages=200

丢包问题发送数据过快,导致服务器网卡爆满,或者磁盘处于繁忙状态,可能会出现丢包现象。
丢包解决方法
1.启用重试机制,重试间隔时间设置长一些
2.设置生产者(ack=all 代表至少成功发送一次) ,即需要相应的所有处于ISR的分区都确认收到该消息后,才算发送成功。
3.对kafka进行限速(限速可能会引起rebalance问题)

rebalance问题参考可解决方案
https://www.cnblogs.com/fengdaye/p/11046264.html
消费者数据不丢失
receiver(开启WAL,失败可恢复)和director(checkpoint保证)

发布了151 篇原创文章 · 获赞 23 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_33598343/article/details/100900055