Kafka如何保证数据不重复?

在Kafka0.11的版本,实现了Exactly Once语义

什么是Exactly Once?

当ack设置为-1时,可以保证Producer到Server的数据不丢失,但是不能保证数据的不重复,即 At Least Once语义。
当ack设置为0时,可以保证Producer到Server的数据不重复,但是不能保证数据不丢失,即 At Most Once语义。
对于一些比较重要的数据,我们下游在处理数据时,即希望数据不丢失也不重复。在Kafka0.11的版本之前,我们只可以保证数据不丢失,在下游处理数据时,每个消费者组都要对数据进行去重,耗费极大的性能。
Kafka在0.11的版本中,引入了“幂等性”的特性。即无论Producer向Server发送多少次重复的数据,Server只会持久化一条数据
At Least Once + 幂等性 就是Exactly Once语义

如何启用幂等性?

将Producer的参数中 enable.idompotence 设置为 true

幂等性实现的原理

Producer启用幂等性后,Producer初始化时会生成一个PID,发往同一个Partition的消息会带有Sequence Number序列号。broker会将<PID, Partition, Seq-Number>当作主键进行缓存,当具有相同主键的消息提交时,broker只会持久化一条。

猜你喜欢

转载自blog.csdn.net/FlatTiger/article/details/114120876