作为一个消息中间件,如果在运行过程中丢失消息,往往是很难排查和追溯的,Kafka也会存在丢失消息的情况,今天我想分析一下Kafka丢失消息的几个原因,以及如何尽可能的防止消息不丢失。在分析Kafka丢失消息的时候,我准备从broker、producer、consumer三端进行分析。
1.broker
producer发送消息到broker端,如果broker接收并保存该消息,返回ack标记到producer,那么认为该消息已经生产并发送完成。
kafka中ack有三种模式:
ack=0,即生产者发送完消息就认为该消息已经发送成功,并不会等到broker的响应,这种是效率比较高的一种方式,但极有可能丢失消息,所以一般不建议使用。
ack=1,即只要写入leader副本成功就认为消息发送成功,就会返回ack到producer,并不会等到该消息同步到其他follower才ack。一般情况下这种是没有问题的,但还是会存在丢失消息的情况,比如leader副本接收到了消息并返回ack到producer,但是此时ISR中的follower副本还没有同步完这条消息,此时leader副本挂了,ISR中的follower会被重新选举为leader,由于之前没有同步完该消息,导致该follower没有这条消息,之前producer也已经收到ack,认为已经发送成功,无法重发消息,那么这条消息就丢失了。(leader的HW是ISR中所有副本中LEO最靠前的那个位置,即消费者只能消费HW位置之前的消息),后面由于新成为leader的follower没有

最低0.47元/天 解锁文章
213

被折叠的 条评论
为什么被折叠?



