94、Kafka消息丢失的场景及解决方案

Kafka消息丢失的场景及解决方案

  • 一、消息发送
  • 二、消费
  • 三、 broker的刷盘

一、消息发送

1、ack=0,不重试
producer发送消息完,不管结果了,如果发送失败也就丢失了。

2、ack=1,leader crash
producer发送消息完,只等待 leader 写入成功就返回了,leader crash了,这时follower没来及同步,消息丢失,

3、unclean .leader .election .enable 配置true
允许选举ISR以外的副本作为leader,会导致数据丢失,默认为false。producer发送异步消息完,只等待leader 写入成功就返回了,leader crash了,这时ISR中没有follower,leader从OSR中选举,因为OSR中本来落后于Leader造成消息丢失。

解决方案:
1、配置: ack=all / -1,tries > 1,unclean.leader.election.enable : false
producer发送消息完,等待follower同步完再返回,如果异常则重试。副本的数量可能影响吞吐量。

不允许选举ISR以外的副本作为leader

2、配置: min.insync.replicas > 1

副本指定必须确认写操作成功的最小副本数量。如果不能满足这个最小值,则生产者将引发一个异常(要么是NotEnoughReplicas,要么是NotEnoughReplicasAfterAppend)

3、失败的offset单独记录
producer发送消息,会自动重试,遇到不可恢复异常会抛出,这时可以捕获异常记录到数据库或缓存,进行单独处理。

二、消费

先commit再处理消息。如果在处理消息的时候异常了,但是offset 已经提交了,这条消息对于该消费者来说就是丢失了,再也不会消费到了。

三、 broker的刷盘

减小刷盘间隔

你可能感兴趣的:(kafka,分布式,消息队列,ack,producer,offset,leader)