隨筆 20241023 Kafka 事务

Kafka 事务概述

  1. 原子性要求:在需要将数据同时发送到多个 broker 中的不同分区时,使用事务可以确保这些操作具备原子性,确保要么全部成功,要么全部失败。

  2. 事务标记:在开启事务时,每一个发往不同分区的消息都会被标记上相同的事务 ID 和生产者 ID(PID),以表明它们属于同一个事务。

  3. 事务状态存储

    • 这些与事务相关的信息(如事务 ID 和 PID)会被发送到 Kafka 的内部主题 __transaction_state 中,并存储在其某个特定的分区中。
    • 这个主题用于记录和监控当前事务的状态。
  4. TransactionCoordinator 角色

    • TransactionCoordinator 是 Kafka 中负责管理事务的协调者。它实时监控 __transaction_state 中的事务状态信息。
    • 当生产者发送消息时,接收数据的 broker 会将其接收进度和结果实时汇总到 __transaction_state 中,TransactionCoordinator 可以根据这些信息了解事务的执行情况。
  5. 提交与回滚

    • 一旦所有消息都成功发送并被正确处理,生产者会通知 TransactionCoordinator 提交事务。
    • TransactionCoordinator 会检查与当前事务 ID 相关的所有操作的状态,确认它们是否全部完成。
    • 如果所有操作都成功,事务会被提交,所有消息在业务主题中变为可见;如果有任何操作失败,事务将被回滚,确保数据的一致性和完整性。

总结

通过这种机制,Kafka 能够保证跨多个 broker 的消息发送在逻辑上的原子性和一致性。无论消息发送到多少个不同的分区,Kafka 都能通过 __transaction_state 主题和 TransactionCoordinator 来监控和管理事务的状态,确保数据的一致性和可靠性。这种设计不仅提升了 Kafka 的灵活性,还确保了在复杂的分布式系统中进行消息传递的可靠性。


        Kafka 的隔离级别(Isolation Level)虽然是一个高层的概念,但其底层实现涉及到多个组件和机制。下面将详细解释 Kafka 如何在底层实现这些隔离级别,特别是 读已提交读未提交 的实现方式。

1. 事务管理机制

在 Kafka 中,事务管理主要依赖于 Transaction Coordinator,它负责管理事务的状态,并协调与消费者的消息可见性。每个生产者在发送消息时会使用一个唯一的 事务 ID,通过这个 ID 来标识属于同一事务的所有操作。

2. 关键概念

  • 事务状态:在 Kafka 中,事务有多种状态,包括 Ongoing(进行中)、Committed(已提交)、和 Aborted(已回滚)。
  • __transaction_state 主题:Kafka 内部使用一个名为 __transaction_state 的主题来记录所有事务的状态。当生产者发送消息时,它会将事务的相关信息(如事务 ID 和状态)写入这个主题,以便 Transaction Coordinator 能够跟踪。

3. 读已提交的实现

  • 消息发送:当生产者发送消息时,这些消息会被标记为“正在进行的事务”,并会写入相应的业务主题分区,但未立即对消费者可见。

  • 状态更新:生产者在完成所有消息发送后,会向 Transaction Coordinator 发送提交请求。此时,Transaction Coordinator 会检查事务中所有消息的状态,并将这些消息的状态更新为 Committed

  • 消费者读取

    • 在消费者尝试读取消息时,Kafka 会检查这些消息的状态。如果消息的状态是 Committed,消费者才能读取到它们。
    • 如果状态仍是 Ongoing,则这些消息将不会对消费者可见。

4. 读未提交的实现

  • 消息发送:与读已提交类似,生产者可以在一个事务中发送多条消息,所有消息也会写入业务主题分区。

  • 状态更新:与读已提交不同的是,在读未提交的情况下,消费者可以读取这些正在进行的事务消息。

  • 消费者读取

    • 当消费者读取消息时,即使某些消息的状态是 Ongoing,它们也会被返回给消费者。
    • 消费者需要自行处理这些未提交消息可能导致的不一致性。

5. Kafka 的数据存储和读取

5.1 消息存储
  • Kafka 将消息存储在分区内,且每个分区是一个有序的日志文件。在这个文件中,消息在被写入时会被分配一个 offset,这个 offset 是唯一的,确保消息的顺序性。
5.2 消息的可见性
  • 当事务提交时,Kafka 更新 __transaction_state 主题中的状态,以确保所有消费者能看到已提交的消息。
  • 只有当事务状态更新为 Committed 时,相关的业务主题消息才会被标记为可见,供消费者读取。

6. 总结

通过将消息状态管理和事务协调集中在 Transaction Coordinator 上,Kafka 实现了对消息可见性和一致性的控制。通过使用 __transaction_state 主题,Kafka 能够在底层跟踪事务的状态,并根据配置的隔离级别决定哪些消息对消费者可见。这样设计确保了在高吞吐量的环境中,Kafka 依然能够保证消息的一致性和可靠性。


1. 提交事务之前数据没有被 broker 接收吗?没有保存到 broker 中吗?

在 Kafka 中,事务的工作方式是:

  • 当你在事务中发送消息时,这些消息会被发送到对应的业务主题的分区中,但在事务提交之前,这些消息并不会被消费者看到。也就是说,虽然消息被写入到 broker 中,但它们的状态是“未提交”的,消费者无法读取这些消息。
  • 具体来说,Kafka 事务的实现机制确保了在事务未提交的情况下,这些消息的“可见性”被屏蔽。Kafka 使用了一种称为“隐式提交”的方式,只有在所有相关消息都成功发送且事务提交后,这些消息才会变得可见。

2. 如果数据已经保存到对应业务 broker 中,如何不被消费者发现?提交成功后又是如何让消费者发现对应消息的呢?

  • 隐式可见性
    • 在 Kafka 事务处理中,事务中的每条消息在被写入 broker 时并不会立即对消费者可见。Kafka 利用 ISOLATION LEVEL(隔离级别)来实现这一点,特别是使用 READ_COMMITTED 隔离级别。这个隔离级别确保消费者在读取消息时,只会看到那些已经提交的消息,而看不到未提交的事务中的消息。
  • 消息提交
    • 一旦你调用提交事务的操作,TransactionCoordinator 会检查所有事务相关消息的状态,确认它们都成功。如果所有消息都成功,TransactionCoordinator 会将这些消息标记为已提交,这意味着它们现在对消费者可见。
    • 提交成功后,这些消息会被消费者看到,消费者在下次读取消息时,就能读取到这些已提交的消息。

小结

通过这种机制,Kafka 能够确保即使在多个分区和 broker 之间进行复杂的事务操作,也能保证数据的一致性和完整性。在事务未提交的情况下,数据不会被消费者看到,从而避免了不一致的状态。而一旦事务提交,所有相关的消息会同时对消费者可见,确保了操作的原子性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在短时间内入门并掌握深度学习?

如何在短时间内快速入门并掌握深度学习,是很多读者的困惑——晦涩难懂的数学 知识、复杂的算法、烦琐的编程……深度学习虽然让无数读者心怀向往,却也让不少人望而生畏,深感沮丧:时间没少花,却收效甚微。 如何才能更好…

python对文件的读写操作

任务:读取文件夹下的批量txt数据,并将其写入到对应的word文档中。 txt文件中包含:编号、报告内容和表格数据。写入到word当中:编号、报告内容、表格数据、人格雷达图以及对应的详细说明(详细说明是根据表格中的标识那一列中的加号…

设计模式(二)工厂模式详解

设计模式(二)工厂模式详解 简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子:Spring 中的 BeanFactory 使用简单工厂模式,产生 Bean 对象。 工厂模式简介 定义:工厂模式是一种创建…

js构造函数和原型对象,ES6中的class,四种继承方式

一、构造函数 1.构造函数是一种特殊的函数,主要用来初始化对象 2.使用场景 常见的{...}语法允许创建一个对象。可以通过构造函数来快速创建多个类似的对象。 const Peppa {name: 佩奇,age: 6,sex: 女}const George {name: 乔治,age: 3,sex: 男}const Mum {nam…

pytorch的标签平滑介绍

什么是标签平滑(Label Smoothing)? 标签平滑(Label Smoothing)是一种正则化技术,旨在防止模型过度自信(即输出的概率分布过于“尖锐”)。在分类任务中,标准的目标标签是one-hot编码,也就是正确类别的概率为 1,其他类别的概率为 0。而标签平滑通过将正确类别的概率从…

小程序开发实战:PDF转换为图片工具开发

目录 一、开发思路 1.1 申请微信小程序 1.2 编写后端接口 1.3 后端接口部署 1.4 微信小程序前端页面开发 1.5 运行效果 1.6 小程序部署上线 今天给大家分享小程序开发系列,PDF转换为图片工具的开发实战,感兴趣的朋友可以一起来学习一下&#xff01…

基于Springboot无人驾驶车辆路径规划系统(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Hadoop:yarn的Rust API接口

今天头一次接触了yarn的Rust API接口,在本地搭建了集群,能够得到每个任务的详细信息。 (一)得到所有任务的所有信息命令: 默认是json格式,也可以指定xml的格式,如(curl --compressed -H "Accept: application/x…

【大模型理论篇】主流大模型的分词器选择及讨论(BPE/BBPE/WordPiece/Unigram)

1. 背景分析 分词是将输入和输出文本拆分成更小单位的过程,使得大模型能够处理。token可以是单词、字符、子词或符号,取决于模型的类型和大小。分词可以帮助模型处理不同的语言、词汇和格式,并降低计算和内存成本。分词还可以通过影响token的…

fmql之Linux RTC

模拟i2c&#xff0c;连接rtc芯片。 dts&#xff1a; /{ // 根节点i2c_gpio: i2c-gpio {#address-cells <1>;#size-cells <0>;compatible "i2c-gpio";// MIO56-SDA, MIO55-SCL // 引脚编号gpios <&portc 2 0&portc 1 0 >;i2c-gp…

Modbus TCP报错:Response length is only 0 bytes

问题描述&#xff1a; 使用modbus_tk库&#xff0c;通过Modbus tcp连接PLC时&#xff0c;python中的一个报错信息&#xff1a; Response length is only 0 bytes报错原因&#xff1a; 与Modbus TCP 服务端建立连接后没有断开&#xff0c;继续作为长连接使用&#xff0c;客户端…

随笔—git操作

1. 创建一个 GitHub 仓库 登录到 GitHub。点击右上角的 “” 按钮&#xff0c;然后选择 “New repository”。填写仓库名称和描述&#xff0c;选择是否公开&#xff0c;最后点击 “Create repository”。 2. 在本地初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; 在…

【Lammps】atomsk安装与环境变量设置(Linux环境)

【Lammps】atomsk安装与环境变量设置&#xff08;Linux环境&#xff09; 官网配置环境变量测试 官网 https://atomsk.univ-lille.fr/dl.php 下载的安装包如下&#xff1a; 使用Linux的解压命令进行解压&#xff1a; tar -xzvf file.tar.gz注意&#xff1a;file.tar.gz 替换…

【Vue 3】最全组件设计指南:从基础到进阶

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ 组件的基础概念与构建2️⃣ 组件通信的核心技术3️⃣ 组件的生命…

【文献及模型、制图分享】中国自然保护地典型治理模式成效比较——基于社区居民感知视角

采取何种治理模式能够更好地提升自然保护地治理的生态、社会和经济成效?基于制度分析与发展&#xff08;IAD&#xff09;框架&#xff0c;选择大熊猫国家公园内部及周边17个社区&#xff0c;通过问卷调查、半结构化访谈、单因素方差、逐步回归分析&#xff0c;比较统治、分治和…

CSP/信奥赛C++刷题训练:经典二分答案例题(3): 洛谷P2920:Time Management S

CSP/信奥赛C++刷题训练:经典二分答案例题(3) [USACO08NOV] Time Management S 题目描述 Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. He has N jobs conveniently numbered 1…N (1 <= N <= 1,000) to accompl…

Spring Boot集成iText实现电子签章

文章目录 一 电子签章1.1 什么是电子签章1.2 签名流程1.3 技术选型 二 实战2.1 生成数字证书2.2 生成印章图片2.3 PDF 签名 一 电子签章 1.1 什么是电子签章 基于《中华人民共和国电子签名法》等相关法规和技术规范&#xff0c;具有法律效力的电子签章一定是需要使用 CA 数字…

Unbounded:一个无限生成式交互的角色生活模拟游戏

❤️ 如果你也关注大模型与 AI 的发展现状&#xff0c;且对大模型应用开发非常感兴趣&#xff0c;我会快速跟你分享最新的感兴趣的 AI 应用和热点信息&#xff0c;也会不定期分享自己的想法和开源实例&#xff0c;欢迎关注我哦&#xff01; &#x1f966; 微信公众号&#xff…

Vertx实现和spring的application.yml自动配置加载

前言 在用vertx写项目的时候&#xff0c;由于需要不同的环境加载不同的配置文件&#xff0c;这里就需要和spring架构的application.yml配置文件一样&#xff0c;可以根据环境变量加载不同的配置。 代码 引入vertx相关依赖 <dependency><groupId>io.vertx</gr…

ECharts饼图-饼图自定义样式,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个饼图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供详…