producer是如何确定分区已经成功的将这条消息保存起来了?
其实就是produce发送消息,leader收到这条消息,并且成功的保存下来了,那么会给producer回复叫做ACK,producer在收到了这样回复之后就认为分区把消息成功保存下来了。
如果producer没有收到这样的消息,那么producer会重复的发送这条消息,再次发送,直到收到为止。这就是kafka中发送数据的保障。

leader在将消息存储到本地之后,follower需要向leader做消息的同步,副本的同步方式有下面两种策略。kafka采用的是第二种策略,当所有的follower同步完成之后才会发送ACK给producer。
第二个策略当中,单反有一个follower没有同步完成,这个时候leader就得一直等下去,直到同步完成才会给producer发ack。这样是不行的,不能让leader死等下去。
leader维护了一个动态的列表,副本同步队列,也就是有哪些follower可以和leader建立联系。这样follower就会存在ISR队列里面。如果follower长时间没有和leader进行同步那么也不会死等下去了,会将follower踢出isr的队列,当剩下的follower将数据同步完成leader就可以向producer发送ack了。


kafka为了保证数据可以成功的写入分区当中会有一个ack的应答机制。
1 不需要等待副本的同步,leader只要将消息写下来了就会返回ack,producer就可以发送下一条消息了。
