5、kafk数据的Exactly once

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;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容