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看成了消息数据,然后将数据发送到一个内部主题中。这样,使用事务处理的流程和咱们自己发送数据的流程是很像的。

接下来,我们就把这两个流程简单做一个对比。

① 普通数据发生流程

在这里插入图片描述

② 事务数据发送流程

在这里插入图片描述

通过两张图可以看到,基本的事务操作和数据操作是很像的。不过要注意,我们这里只是简单对比了数据发送的过程,其实它们的区别还在于数据发送后的提交过程。普通的数据操作,只要数据写入了日志,那么对于消费者来讲。数据就可以读取到了,但是事务操作中,如果数据写入了日志,但是没有提交的话,其实数据默认情况下也是不能被消费者看到的。只有提交后才能看见数据。

更为详细的可以参考下图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/873714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:http协议

计算机网络:http协议 一、本文内容与前置知识点1. 本文内容2. 前置知识点 二、HTTP协议工作简介1. 特点2. 传输时间分析3. http报文结构 三、HTTP版本迭代1. HTTP1.0和HTTP1.1主要区别2. HTTP1.1和HTTP2主要区别3. HTTPS与HTTP的主要区别 四、参考文献 一、本文内容…

BERT 论文逐段精读【论文精读】

BERT: 近 3 年 NLP 最火 CV: 大数据集上的训练好的 NN 模型,提升 CV 任务的性能 —— ImageNet 的 CNN 模型 NLP: BERT 简化了 NLP 任务的训练,提升了 NLP 任务的性能 BERT 如何站在巨人的肩膀上的?使用了哪些 NLP 已有的技术和思想&#xff…

网络层协议-ARP协议

网络层协议-ARP协议 1)概述 ARP:地址解析协议,作用:根据IP地址查询MAC地址 数据包发送前需要进行封包,在数据链路层需要封装源mac地址是自己的mac,目的mac地址是别人,但是不知道别人的mac地址…

基于VUE的校园二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于VUE的校园二手物品交易管理系统8拥有两种角色 管理员:闲置物品管理、订单管理、用户管理 用户:登录注册、购物车、发布闲置物品、评论、发货、收货地址管理等…

AI在医学领域:MIL回归用于前列腺癌复发预测

2024年,全球男性新癌症病例预计为1029080例,其中前列腺癌病例预计为29%。前列腺癌是男性中第二常见的癌症类型,仅次于肺癌。它主要影响老年男性,且发病率随年龄增长而增加。前列腺癌的主要治疗方法是前列腺切除术,但术…

探索手势能够识别在训练数据中未观察到的情绪

介绍 论文地址:https://arxiv.org/pdf/2202.10571.pdf 基于人工智能的情感识别研究领域是各个领域不可或缺的,如机器人和情感计算,并在语音中使用面部表情和手势来实现人们提出了各种方法来识别一个人的情绪。然而,这些基于机器学…

C语言 | Leetcode C语言题解之第391题完美矩形

题目: 题解: /* 参照官方答案题解: 1.小矩形面积之和等于大矩形区域面积 2.矩形区域内部顶点出现次数只能是2次或4次(边界四个顶点只能出现一次) */ typedef struct {int x;int y; } Coordinate;typedef struct {Coor…

JavaWeb(后端)

Spring-MVC Spring MVC(Model-View-Controller)是Spring框架中的一个模块,用于构建基于MVC设计模式的Web应用程序。Spring MVC将应用程序分为三个主要部分: Model:负责处理数据和业务逻辑。View:负责展示…

Rancher 与 Kubernetes(K8s)的关系

1. 简介 1.1 Kubernetes 作为容器编排平台 Kubernetes 是一个开源平台,用于自动化部署、扩展和管理容器化的应用。它提供了容器调度、自动伸缩、健康检查、滚动更新等功能。 例子:假设您有一个微服务架构的应用程序,需要运行在多个节…

单例的饿汉式,懒汉式的线程安全问题

1 单例的饿汉式 对象在类加载的时候就创建了,线程安全,速度块,但是浪费空间, public class Hungry {//唯一对象private static final Hungry HUNGRY new Hungry();byte byte1[]new byte[1024];byte byte2[]new byte[1024];byte…

openSSL 如何降版本

文章目录 前言openSSL 如何降版本1. 卸载2. 安装新的openssl版本3. 验证 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话&…

DDS-数据分发服务

目录 1.ROS2架构 2.DDS概念 参考资料 1.ROS2架构 在ROS 2(Robot Operating System 2)中,系统通常由以下几个核心部分组成,它们共同构成了ROS 2的架构和功能: Plumbing(管道): 这个术语在ROS …

Oracle OCP认证值得考吗? 需要门槛吗?

随着数据量的爆炸性增长和企业对数据依赖性的提升,对数据库专业人士的需求也在不断上升。OCP认证,作为Oracle公司提供的权威认证之一,长期以来被视为数据库专业人士技能和知识水平的重要标志。 但随着技术的发展和认证种类的增多,…

快速解决git am冲突

前言 当希望通过git am xxxx.patch,添加一些代码修改,如果代码版本相差较大,就可能产生冲突。 这种必须要我们手动修改冲突内容。 解决过程 1. git am 尝试打入patch补丁 git am 0004-patch.patch2. git apply --reject生成冲突文件 执行…

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:error是设置我们失败的logo 设置的文字上…

keil安装及运行第一个stm32程序

前言 记录如何安装keil软件及运行第一个stm32程序 目录 一、keil开发环境搭建 0.keil是什么 1.keil下载 2.keil软件安装 3.安装芯片支持包 4.破解激活 二、keil工程结构 1.创建目录结构 2.新建工程 3.配置项目 (1).例程准备 (2).工程目录管理 (3).选项配置 4.例…

渗透测试学习资源

burp学院 https://portswigger.net/burp/documentation/desktop/getting-started https://portswigger.net/web-security/ hacker101学院 https://www.hacker101.com/ https://github.com/bugcrowd/bugcrowd_university 如何白嫖自学网络安全技术,最稳最推荐的网…

CGAL 概念模型及Traits 概述

CGAL 概念模型及Traits 本节释了概念Concepts 、模型Models以及Traits类的含义。 CGAL Concepts and Models 概念Concepts是对类型的一组要求,即它具有特定的嵌套类型、特定的成员函数或具有特定的以该类型为参数的自由函数。概念的模型 Models是一个满足概念需求…

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨…

IEEE投稿模板翻译

>将这一行替换为您的稿件id号(双击此处编辑)< IEEE 期刊和会议论文的撰写准备&#xff08;2022&#xff09; 第一作者 A. 作者&#xff0c;IEEE成员&#xff0c;第二作者 B. 作者&#xff0c;第三作者 C. 作者 Jr.&#xff0c;IEEE成员 摘要—本文档为IEEE会刊、期刊和…