Kafka消息丢失
Kafka服务端
Kafka只对已提交消息做有限度持久化保证
- 已提交消息,收到消息并成功写入Broker,该消息为已提交消息。若ack设置为-1则成功写入broker的意思是leader节点+副本节点都需要写入成功,kafka默认只用leader节点写入成功即可
- 有限度持久化,即当kafka集群出现故障时,起码有一台broker是活着的。
Kafka生产者消息丢失
使用了producer.send(msg),这个方法是异步的,不保证消息发送成功,因此应该使用producer.send(msg,callback)函数,能保证消息发送成功,若失败了还能调用callback进行处理。
Kafka消费者消息丢失
- 先更新了位移,在消费,此时位移更新了,消费失败,则会出现消息丢失。当然先消费,在更新位移,也可能出现重复消费的问题,这个需要保证幂等性。
- 批量获取多条消息,开启多线程去消费,然后自动更新了位移,此时若有一个线程消费失败,但位移已经改变,也会出现消息丢失的场景。
总结
- 不要使用异步发送消息,而需要使用带有回调通知的send方法。
- 设置acks=-1,保证所有follower都持久化好消息,在返回成功。
- 设置retires为一个较大的值,当出现消息发送失败的情况,进行重试发送消息。
- 设置unclean.leader.election,enable=false如果某一个follower落后leader很多,则不让该follower竞选
- replication.factor>=3设置副本数,多冗余消息,防止消息丢失
- min.insync.replicas>1。控制消息至少要被写入多少个副本才算已提交
- replication.factor>min.insync.replicas。提高可用性。推荐设置replication.factor=min.insync.replicas+1
- 不设置自动提交,enable.auto.commit=false,而采用手动提交位移的方式,改变位移