Kafka的ACK机制,指的是producer的消息发送确认机制,这直接影响到Kafka集群的吞吐量和消息可靠性。而吞吐量和可靠性就像硬币的两面,两者不可兼得,只能平衡。
Kafka的ACK机制是针对producer的。
保证消息的吞吐量就是producer只负责发数据,不需要得知消息是否被集群接收,这样就会有大量的数据发送到Kafka的集群中,保证了Kafka集群的吞吐量。
保证消息的可靠性就是发送消息必须保证消息存储到了集群中,producer才能发送下一个消息。
ACK有3个可选值,分别是1,0,-1 。
等待leader接收成功即可。
只要收到一个分区副本成功写入的通知,就认为推送消息成功了。当然,这个副本必须是leader副本,只有leader成功写入后,producer才会认为消息发送成功。
ACK = 1 的情况,producer只要收到leader写入成功的通知,就会认为消息发送成功了,但是如果leader写入成功了,没来得及将数据同步到follower节点,原本的leader就死亡了,此时消息就会丢失。
ACK的默认值就说1 。这个默认值就说吞吐量与持久性的这种方案。
发送一次,不论leader是否接收。
producer 不管发送成不成功,只发送一次就不再发送了。
提供了最低的延迟,保证了最大的吞吐量,但持久性最弱,无法保证broker是否接收到消息,无法确定leader是否死亡,也无法保证leader接收到消息后是否发送给follower。
需要等待leader将消息同步给follower。
producer只有收到分区所有副本的成功写入的通知才认为推送消息成功了。