producer是如何确定分区已经成功的将这条消息保存起来了其实就是produce发送消息leader收到这条消息并且成功的保存下来了那么会给producer回复叫做ACKproducer在收到了这样回复之后就认为分区把消息成功保存下来了。如果producer没有收到这样的消息那么producer会重复的发送这条消息再次发送直到收到为止。这就是kafka中发送数据的保障。leader在将消息存储到本地之后follower需要向leader做消息的同步副本的同步方式有下面两种策略。kafka采用的是第二种策略当所有的follower同步完成之后才会发送ACK给producer。第一个策略当中副本的数量是有要求的。第二个策略当中但凡有一个follower没有同步完成这个时候leader就得一直等下去直到同步完成才会给producer发ack。这样是不行的不能让leader死等下去。leader维护了一个动态的列表副本同步队列也就是有哪些follower可以和leader建立联系。这样follower就会存在ISR队列里面在一个主题描述信息查看的时候可以看到leader和follower的结合也就是哪些follower可以和leader建立联系这样的follower就会存在于ISR队列当中。当ISR中的follower完成数据的同步之后leader就就会给producer发送ack应答。如果follower长时间没有和leader进行同步那么也不会死等下去了会将follower踢出isr的队列当剩下的follower将数据同步完成leader就可以向producer发送ack了。同样当leader发生故障之后就会从ISR列表中当中选举一个新的leader出来。这就是Kafka当中消息保障的机制。kafka为了保证数据可以成功的写入分区当中会有一个ack的应答机制。1 不需要等待副本的同步leader只要将消息写下来了就会返回ackproducer就可以发送下一条消息了。
