论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
大数据
›
数据仓库与分析
›
Kafka【九】如何实现数据的幂等性操作
Kafka【九】如何实现数据的幂等性操作
三尺非寒
金牌会员
|
2024-11-7 20:31:59
|
显示全部楼层
|
阅读模式
楼主
主题
898
|
帖子
898
|
积分
2694
为相识决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企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
三尺非寒
金牌会员
这个人很懒什么都没写!
楼主热帖
Centos7安装Mysql5.7(超详细版) ...
微信小程序--点餐系统(本地服务器+源 ...
可观测性之两大误区
Java多线程超级详解(只看这篇就够了) ...
小白也可以轻松破解被加密的ZIP口令啦 ...
GPRS与4G网络:技术差异与应用选择 ...
如何获取Class对象呢?
“远程客户端操作hdfs创建文件夹”,验 ...
如何从命令行启动 CST 软件? ...
环形缓冲区 Ring Buffer 的实现 ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表