Kafka-数据唯⼀性保证-ExactlyOnce语义kafka最新版本
背景
将服务器的ACK级别设置为 -1 ,可以保证producer到Broker之间不会丢失数据,即 At Least Once 语义。相对的,将服务器的ACK级别设置为0,可以保证⽣产者每条消息只会被发送⼀次,即 At Most Once语义。
AtLeastOnce 可以保证数据不丢失,但不能保证数据不重复;相对的AtMostOnce可以保证数据不重复,但不能保证数据不丢失。
对于⽣产中⼀些重要的服务信息,⽐如:订单交易数据,下游consumer要求数据既不能重复,也不能丢失:即Exactly Once语义。在0.11版本以前的Kafka,对此是⽆能为⼒的,只能保证数据不丢失,在下游consumer对消息数据做全局去重。
引⼊
0.11版本的Kafka,引⼊了⼀项重⼤特性:幂等性。
所谓幂等性就是指Producer不论向Broker发送多少次重复数据,Broker端都只持久化⼀条。幂等性结合 AtLeastOnce语义,就构成了Kafka的 Exactly Once语义。即:
At Least Once + 幂等性 = Exactly Once
启⽤幂等性
要启⽤幂等性,只需要将Producer的参数 enable.idompotence = true 即可。
将下游Consumer需要的做去重⼯作交给数据上游的Producer来做。开启幂等性的 Producer在初始化的时候会被分配⼀个PID,发往同⼀ Partition 的消息会附带 Sequence Number。⽽ Broker 端会对<PID, Partition, SeqNumber> 做缓存,当具有相同主键的消息提交
时,Broker只持久化⼀条。
但是PID重启就会变化,同时不同Partition也具有不同主键,所以幂等性⽆法保证跨分区、跨会话的 Exactly Once。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论