在了解这个参数之前请先了解的kafka集群中的副本机制和相关概念,Kafka集群中1个分区可以分布到不同的broker中,其中1个副本是领导者(Leader) 其余的是 跟随着(Follower)。

kafka acks参数 是针对生产者配置的参数。

kafka acks参数可以配置3个值,分别是0,1,all。

首先明白ack是什么意思,直译过来是确认,谁跟谁确认呢?确认什么呢?前面已经说了第一个谁是kafka的生产者,那么第二谁就是kafka中副本了,就是说kafka中的生产者需要找副本确认,确认你的消息是否成功接收到了,我就认为我的消息是否发送成功了。这就是为什么需要了解副本的概念。

acks=0

当acks=0时,就是不确认,kafka的生产者发送到分区副本,我就不管了,不管你是否真的接收并将消息存储到磁盘,我都认为你成功了。

kafka acks参数

那么这种方式一看就是不安全的,很容易导致数据丢失,因为我连个确认机制都没有。

acks=1

acks=1是kafka 默认的配置值 ,它的意思是kafka的生产者发送到分区副本,只需要等待副本的领导者(Leader)给我确认写入磁盘成功,我就认为这条消息发送成功了。 

不过这个也存在消息的丢失,那就是当领导者(Leader)成功接收到消息,还没等跟随着(Follower)成功拉去,领导者就宕机了,那这是个问题。

kafka acks参数

acks=all

既然光领导者(Leader)副本确认不够,会导致数据丢失,那就让跟随着(Follower)也确认把,这样就不会有数据的丢失了。

此时只需要设置acks=all即可。

kafka acks参数

注意:acks=all 需要有2个或2个以上副本的kafka集群才能保证数据不丢失,否则当其中一个broker宕机了也会造成数据的丢失。

总结

想要高吞吐率可以使用默认的参数设置acks=1,想要数据不丢失可以使用acks=all.

这个参数延申出来的面试问题便是 kafka如何保证数据的不丢失。