kafka数据可靠性,用ack来保证,有0值,1值,和-1值,生产环境需要根据实际情况来配置,但是无论配置哪种,要么会丢失数据,要么会重复数据,这里就产生了两个概念:至多一次 和 至少一次;
至多一次(At Most Once):数据保证不重复,但是不能保证数据不丢失;
至少一次(At Least Once):数据保证不丢失,但是不能保证数据不重复;
但是有些数据既不能丢失也不能重复,难道就不能是 完美一次(Exactly once) 嘛?
在0.11版本以前,kafka是无能为力的。只能保证数据不丢失,然后在下游消费数据时,在代码里做去重。
在之后的版本里,kafka引入一项重大特性: 幂等性;
幂等性
所谓幂等性就是指producer不论向server发送多少次重复消息,在kafka的server端只保留一条。 幂等性结合At Least Once语义,就构成了kafka的Exactly Once语义;即:
幂等性 + At Least Once = Exactly Once
要启用幂等性,需要将producer的参数中的enable.idompotenc设置为true;开启幂等性的producer 在初始化的时候被分配一个PID,发往同一个partition的消息会附带Sequence Number,而broker端会将<PID, partition, Sequence Number>进行缓存,当具有相同主键的消息提交时,broker只会保留一条;
注意:PID重启就会发生变化,不同的partition具有不同的主键,所以幂等性无法保证跨分区和跨会话的Exaclty Once;