kafka之消息重复及解决方案

一。生产者阶段重复
原因:生产发送的消息没有收到正确的broke响应,导致生产者重试。
过程:

  1. new KafkaProducer()后创建一个后台线程KafkaThread扫描RecordAccumulator中是否有消息;
  2. 调用KafkaProducer.send()发送消息,实际上只是把消息保存到RecordAccumulator中;
  3. 后台线程KafkaThread扫描到RecordAccumulator中有消息后,将消息发送到kafka集群;
  4. 如果发送成功,那么返回成功;
  5. 如果发送失败,那么判断是否允许重试。如果不允许重试,那么返回失败的结果;如果允许重试,把消息再保存到RecordAccumulator中,等待后台线程KafkaThread扫描再次发送;

解决方案:
1.启动kafka的幂等性,设置: enable.idempotence=true ,以及 ack=all 以及 retries > 1 。
2.ack=0,不重试,适用高吞吐量忽略消息准确性。

二。生产者和broker阶段消息丢失
原因:
1.ack设置为1或者设置为0,为0时不确认broke是否听到,为1时只是leader副本同步
2. unclean.leader.election.enable 配置true,允许选举ISR以外的副本作为leader,会导致数据丢失,默认为false。

解决方案
1.ack设置为ALL, 配置:min.insync.replicas > 1
2.unclean.leader.election.enable 配置false
3.失败的offset单独记录

三。消费者数据重复
原因:数据消费完没有及时提交offset到broker。
解决方案:
1.取消自动提交offset,适用手动提交offset
2.下游做幂等,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值