Ack应答

Acks=0无论leader的数据有没有落盘都可以发送,但数据的可靠性就非常差,一般都不会用,效率高

Acks=1 当leader的数据落盘之后,follow不管有没有落盘,应答发送,可靠性中等,效率也中等(当leader挂了,重新选举leader,由于之前的应答,之前的数据就丢失了)

Acks=-1只有当leader和isr中的follow的数据都落盘之后才能应答,效率最低,但数据的可靠性最强,(但存在问题就是当其中一个的follow挂了,就迟迟不会应答,而导致集群瘫痪)

为了解决这个防止瘫痪的问题就有了isr队列,时刻来存储可以和leader保持通讯的节点id

还有一种会出现发送重复的情情况,就是在leader和isr里的follow都落盘之后,leader挂了,就会重新在选举leader,此时由于之前的没有应答成功,导致之前的数据在发一次就会导致数据重复,在0.11版本之后出现了幂等性原理和事务处理可以解决数据重复的问题

当副本数为1时,效果就会和acks=1一样,为了避免这个,所以

接受端至少一次=Acks为-1+分区副本数量大于等于2+isr里应答的最小副本数大于等于2

幂等性说白了就是在数据到kafka集群中,进行的一次去重,通过三个指标(UID,PartitionId,SeqNum)来判断是否重复

但是UID每次kafka重启一次就会重新分配一个,所以只能是在单分区单次会话中能保证不重复

Enable.idempotence=true( 默认开启)

kafka回退机制 kafka回调机制_kafka

事务处理,事务在使用前必须在配置文件里指定事务唯一的producer_id ,必须要开启幂等性,而如果客户端挂了(UID)就可能导致重复,而事务处理就能够将客户端挂了,就能够回滚到之前的状态(还没开始上传leader数据),开启客户端通过未完成的事务重新上传

kafka回退机制 kafka回调机制_kafka回退机制_02

kafka回退机制 kafka回调机制_kafka_03