ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Kafka【九】如何实现数据的幂等性操作
[打印本页]
作者:
三尺非寒
时间:
2024-11-7 20:31
标题:
Kafka【九】如何实现数据的幂等性操作
为相识决Kafka传输数据时,所产生的数据重复和乱序题目,Kafka引入了幂等性操作,所谓的幂等性,就是Producer同样的一条数据,无论向Kafka发送多少次,kafka都只会存储一条。注意,这里的同样的一条数据,指的不是内容一致的数据,而是指的不断重试的数据。
默认幂等性是不起作用的,以是如果想要使用幂等性操作,只必要在生产者对象的设置中开启幂等性设置即可。
设置项设置值说明enable.idempotencetrue开启幂等性max.in.flight.requests.per.connection小于即是5每个毗连的在途哀求数,不能大于5,取值范围为[1,5]acksall(-1)确认应答,固定值,不能修改retries>0重试次数,保举使用Int最大值
【1】kafka实现幂等性的流程
① 数据增长唯一性标识
开启幂等性后,为了保证数据不会重复,那么就必要给每一个哀求批次的数据增长唯一性标识。kafka中,这个标识接纳的是一连的序列号数字sequencenum。但是不同的生产者Producer大概序列号是一样的,仅仅靠seqnum还无法唯一标记数据,以是还必要同时对生产者进行区分。
Kafka接纳申请生产者ID(producerid)的方式对生产者进行区分。在发送数据前,我们就必要提前申请producerid以及序列号sequencenum。
② 记录生产者的生产状态
Broker中会给每一个分区记录生产者的生产状态:接纳队列的方式缓存最近的5个批次数据。队列中的数据按照seqnum进行升序排列。这里的数字5是经过压力测试,均衡空间服从和时间服从所得到的值,以是为固定值,无法设置且不能修改。
③ 判重
判断Borker当前新的哀求批次数据在缓存的5个旧的批次中是否存在相同的,如果有相同的,那么说明有重复,当前批次数据不做任那边理。
④ 判断序列号是否一连
如果Broker当前的哀求批次数据在缓存中没有相同的,那么判断当前新的哀求批次的序列号是否为缓存的末了一个批次的序列号加1:
如果是,说明是一连的,顺序没乱,那么继续。
如果不是,那么说明数据已经乱了,发生异常。
⑤ 重试
Broker根据异常返回响应,通知Producer进行重试。Producer重试前,必要在缓冲区中将数据重新排序,保证精确的顺序后再进行重试即可。
⑥ 更新数据
如果哀求批次不重复,且有序,那么更新缓冲区中的批次数据。将当前的批次放置再队列的末了,将队列的第一个移除,保证队列中缓冲的数据最多5个。
⑦ 缺陷
从上面的流程可以看出,Kafka的幂等性是通过消耗时间和性能的方式提升了数据传输的有序和去重,在一些对数据敏感的业务中是非常重要的。但是这种幂等性还是有缺陷的:
幂等性的producer仅做到单分区上的幂等性,即单分区消息有序不重复,多分区无法保证幂等性。
只能保持生产者单个会话的幂等性,无法实现跨会话的幂等性,也就是说如果一个producer挂掉再重启,那么重启前和重启后的producer对象会被当成两个独立的生产者,从而获取两个不同的独立的生产者ID,导致broker端无法获取之前的状态信息,以是无法实现跨会话的幂等。要想解决这个题目,可以接纳后续的事件功能。
【2】跨会话的幂等性
对于幂等性的缺陷,kafka可以接纳事件的方式解决跨会话的幂等性。根本的原理就是通过事件功能管理生产者ID,保证事件开启后,生产者对象总能获取一致的生产者ID。
为了实现事件,Kafka引入了事件和谐器(TransactionCoodinator)负责事件的处理,所有的事件逻辑包罗分派PID等都是由TransactionCoodinator负责实施的。TransactionCoodinator 会将事件状态持久化到该主题中。
事件根本的实现思绪就是通过设置的事件ID,将生产者ID进行绑定,然后存储在Kafka专门管理事件的内部主题 __transaction_state中,而内部主题的操作是由事件和谐器(TransactionCoodinator)对象完成的,这个和谐器对象有点类似于咱们数据发送时的那个副本Leader。
着实这种筹划是很奇妙的,因为kafka将事件ID和生产者ID看成了消息数据,然后将数据发送到一个内部主题中。这样,使用事件处理的流程和咱们自己发送数据的流程是很像的。
接下来,我们就把这两个流程简单做一个对比。
① 平凡数据发生流程
② 事件数据发送流程
通过两张图可以看到,根本的事件操作和数据操作是很像的。不过要注意,我们这里只是简单对比了数据发送的过程,着实它们的区别还在于数据发送后的提交过程。平凡的数据操作,只要数据写入了日志,那么对于消耗者来讲。数据就可以读取到了,但是事件操作中,如果数据写入了日志,但是没有提交的话,着实数据默认情况下也是不能被消耗者看到的。只有提交后才能看见数据。
更为详细的可以参考下图:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4