Kafka一致性级别:
名称 | 设置 | 一致性 |
---|---|---|
At Least Once | acks=-1 | 保证数据不丢失,但不能保证数据不重复 |
At Most Once | acks=0 | 保证数据不重复,但不能保证数据不丢失 |
Exactly Once | acks=-1 + enable.idompotence=true | 精准一致性,保证数据生产不丢失不重复 |
0.11版本的Kafka引入了一项重大特性:幂等性。
幂等性:Producer不论向Server发送多少次重复数据,Server端都只会持久化一条。幂等性结合At Least Once语义,就构成了Kafka的Exactly Once语义。即:
At Least Once + 幂等性 = Exactly Once
要启用幂等性,只需要将Producer的参数中enable.idompotence
设置为true即可。Kafka的幂等性实现其实就是将原来下游需要做的去重放在了数据上游。
实现原理:
开启幂等性的Producer在初始化的时候会被分配一个PID(Producer ID),发往同一Partition 的消息会附带Sequence Number。而Broker端会对<PID, Partition, SeqNumber>
做缓存,当具有相同主键的消息提交时,Broker只会持久化一条。
使用时,只需将enable.idempotence属性设置为true,kafka自动将acks属性设为-1。
缺陷:
PID在生产者重启就会发生变化,且不同的Partition也具有不同主键,所以幂等性无法保证跨分区跨会话的Exactly Once。(跨会话指Producer挂掉后重新建立连接。)
此外,Kafka没有针对实际内容判断重复所以自定义判断。
总结:
Kafka的幂等性(0.11版本引入)实现Producer不论向Server发送多少次重复数据,Server端都只会持久化一条。具体是根据<PID, Partition, SeqNumber>
做判断重复,但是PID重启就会发生变化,且不同的Partition也具有不同主键,所以幂等性无法保证跨分区跨会话的Exactly Once。