数据完全可靠条件
= ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2
可靠性总结:
⚫ acks=0,生产者发送过来数据就不管了,可靠性差,效率高;
⚫ acks=1,生产者发送过来数据Leader应答,可靠性中等,效率中等;
⚫ acks=-1,生产者发送过来数据Leader和ISR队列里面所有Follwer应答,可靠性高,效率低;
在生产环境中,acks=0很少使用;acks=1,一般用于传输普通日志,允许丢个别数据;acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。
数据重复分析:
acks: -1(all):生产者发送过来的数据,Leader和ISR队列里面的所有节点收齐数据后应答。
重复数据的判断标准:
幂等性:具有<PID, Partition, SeqNumber>相同主键的消息提交时,Broker只会持久化一条。其中PID是Kafka每次重启都会分配一个新的;Partition 表示分区号;Sequence Number是单调自增的。
所以幂等性只能保证的是在单分区单会话内不重复。
如何使用幂等性
开启参数 enable.idempotence 默认为 true,false 关闭。
数据精准一次(Exactly Once)
1)生产者角度
⚫ acks 设置为-1 (acks=-1)。
⚫ 幂等性(enable.idempotence = true) + 事务 。
2)broker 服务端角度
⚫ 分区副本大于等于 2 (--replication-factor 2)。
⚫ ISR 里应答的最小副本数量大于等于 2 (min.insync.replicas = 2)。
3)消费者
⚫ 事务 + 手动提交 offset (enable.auto.commit = false)。
⚫ 消费者输出的目的地必须支持事务(MySQL、Kafka)。