> 文章列表 > Kafka 生产者ACK配置的区别

Kafka 生产者ACK配置的区别

Kafka 生产者ACK配置的区别

目录

1、ACK = -1 

2、ACK = 0

3、ACK = 1 

重点

0.10版本之后为什么要移除延迟条数

选举机制


1、ACK = -1 

        这种情况是不会丢失数据的,因为Broker包含Topic,Topic又包含Partition,而Partition里边还有副本,这里就会有Leader和Follower的概念,此时生产者发送消息后,但是会有数据重复的问题,这个问题可以在下游消费数据的时候进行处理一般都是采用去重的操作;

2、ACK = 0

        此时相当于是消息的异步发送,生产者发送消息以后不会等待Leader这边的任何响应,如果在发送消息后系统发生停电或者宕机此时是会丢失数据的但是这种机制的特点是效率特别高。

3、ACK = 1 

        此时生产者会等待Leader响应,但是Leader响应的时间是在接受到数据后而不是所有的Follower成功后继续你那个响应,如果在Leader刚响应并且Follower没有来的及进行同步,此时服务器宕机也会丢失数据的。

重点

这里还有一个很重要的概念就是ISR副本同步队列,在这个队列里边包含了Leader和Follower,主要解决的问题就是Leader挂了以后谁来做Leader的问题。

这个队列在0.10版本之前主要是用两个参数来进行维护的:一个是延迟条数,一个是延迟时间。但是在0.10版本之后移除了延迟条数的参数。

0.10版本之后为什么要移除延迟条数

主要的目的是为了解决节点频繁进入队列的问题,因为生产者发送消息是批量发送的,如果一批数据的数量大于同步的条数就会导致这些成员频繁的进入ISR队列中,从而导致集群性能的下降,而且ISR队列成员之间的通信是依靠Zookeeper来完成的。如果频繁的进出队列这个通信的成本也是很高的;ISR同步队列选举的时候会根据前边设置的ACK来执行不同的选举策略。

如果ACK = -1 也就是全部同步,它会使用它自己的一个概念就是水位线,在队列进行同步时候并不是所有Follower都能达到这个Leader的水位线,也就是LEO这个时候他会维护一个标准的水位,如果ISR同步队列汇总的成员同步超时了就会被提出ISR同步队列而进入OSR队列。

选举机制

选举机制就是通过这个ISR来进行的,默认是有一个排序的一般都是选取第一个,因为每一批数据只有最快的那个才能达到一个接收消息,其中ISR队列以及Leader的选举是由Controller来控制的,Zookeeper来进行存储,关于Controller在Kafka中也是非常重要的Controller也有一个专门的选举机制,它是相当于是用Zookeeper来做了一个分布式锁,具体原理就是利用了Zookeeper生成的临时节点,生成的一个分布式锁,谁先抢占到谁就是Leader.