Kafka实现事务的机制

devtools/2025/3/4 9:33:04/

1. Kafka中事务的几个基本概念

Kafka 事务主要由 生产者(Producer) 来实现,核心概念包括:

  • TransactionalId:事务 ID,Kafka 用它来唯一标识一个事务。
  • Transaction Coordinator:事务协调器,负责管理事务的状态和提交过程。
  • Producer Id (PID) & Epoch:每个事务生产者会被分配一个唯一的 PIDEpoch,用于事务恢复和幂等性支持。
  • Write-Ahead Log (WAL):Kafka 事务使用内部的 事务日志(WAL) 记录事务状态,以支持事务恢复。

2. Kafka 事务的执行流程

  1. 初始化事务:生产者需要设置 transactional.id 并初始化事务。
  2. 开启事务:调用 beginTransaction() 开始事务。
  3. 发送数据:生产者在事务中发送数据到不同的 topic 分区。
  4. 提交事务:调用 commitTransaction() 提交事务,Kafka 保证所有消息都可见。关键性的一部。只有在执行了commitTransaction之后,协调器才会把所有消息更新为提交状态。
  5. 事务回滚(可选):如果事务失败,调用 abortTransaction(),Kafka 保证所有已发送的消息都被丢弃。
  6. 消费者可见性:消费者只能看到已提交事务的消息,而未提交或回滚的消息不会对消费者可见。

Kafka保证事务的一致性,主要是分别保证生产者,消费者两端都要保证一致性。即生成端保证多个消息要不全部发送成功,要不就全部发送失败。

生产端代码:

producer.initTransactions(); // 初始化事务
try {producer.beginTransaction(); // 开始事务ProducerRecord<String, String> record1 = new ProducerRecord<>("topicA", "key1", "value1");ProducerRecord<String, String> record2 = new ProducerRecord<>("topicB", "key2", "value2");producer.send(record1);producer.send(record2);producer.commitTransaction(); // 提交事务
} catch (Exception e) {producer.abortTransaction(); // 事务回滚
}

如上代码所示,只要在commitTransaction()执行成功之后,record1和record2 才被认为发送成功,即事务协调器把两条消息全部改成已提交状态,此时的消息才会被消费者看见。如果abortTransaction()执行,则两条消息都任务发送失败,消费端不回看到任何消息。

消费端代码:

Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ConsumerConfig.GROUP_ID_CONFIG, "consumer-group-1");
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");// 仅读取已提交事务的数据
props.put(ConsumerConfig.ISOLATION_LEVEL_CONFIG, "read_committed");// 关闭自动提交偏移量
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("topicA"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {try {// 处理消息(如写入数据库)process(record);// 手动提交偏移量(只有成功处理后才提交)consumer.commitSync();} catch (Exception e) {// 处理失败,偏移量不会提交,Kafka 会重新投递该消息System.err.println("处理失败,稍后重试:" + e.getMessage());}}
}
  • 只有消息处理成功后才提交偏移量,确保不会丢失消息。
  • 失败时不提交偏移量,Kafka 会重新投递消息。以此保证消息一定被消费掉。

总结

事务提交后 (commitTransaction()),所有消息才会变成 "已提交",消费者才能读取这些消息
如果事务回滚 (abortTransaction()),Kafka 会丢弃这些消息,消费者不会看到它们
消费者必须使用 read_committed 隔离级别,否则可能读取到未提交的事务数据。


http://www.ppmy.cn/devtools/164423.html

相关文章

基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“数据驱动的资产管理系统站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统登录界…

图数据库Neo4j面试内容整理-图的聚类与社区检测

图的聚类与社区检测 是图分析中两个非常重要的任务,尤其是在社交网络、推荐系统、信息传播等领域中。通过这些技术,我们可以发现图中的潜在结构和模式,例如社交网络中的社区、学术论文中的研究领域等。社区检测和聚类有助于揭示图中节点的群体结构,进而挖掘出有价值的模式和…

特征分解(Eigen decomposition)在深度学习中的应用与理解

特征分解在深度学习中的应用与理解 特征分解&#xff08;Eigendecomposition&#xff09;是线性代数中的一个核心工具&#xff0c;在深度学习领域有着广泛的应用&#xff0c;尤其是在涉及矩阵操作和概率模型时。对于研究者来说&#xff0c;理解特征分解不仅有助于掌握数学基础…

在 ASP.NET Core 中压缩并减少图像的文件大小

示例代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/90294127 在当今的数字时代&#xff0c;图像是 Web 应用程序和用户体验不可或缺的一部分。但是&#xff0c;处理大型图像文件可能会导致网页加载缓慢和更高的存储费用。为了解决这个问题&#xff0c;在…

Docker + Vue2 热重载:为什么需要 CHOKIDAR_USEPOLLING=true?

在 Docker 中运行 Vue 2 项目时&#xff0c;许多开发者会遇到 代码修改后热重载&#xff08;Hot Reload&#xff09;失效的问题。虽然 Vue 2 默认支持热重载&#xff0c;但由于 Docker 文件监听机制的特殊性&#xff0c;Webpack 的 watch 机制可能无法正常工作。 本文将深入解析…

分布式和微服务的理解

分布式系统和微服务是现代化软件架构中两个关键概念&#xff0c;它们共同支撑了高可用、高扩展的互联网应用&#xff0c;但侧重点和解决的问题有所不同。以下是它们的核心理解&#xff1a; ​一、分布式系统&#xff08;Distributed System&#xff09;​ 定义&#xff1a; 分…

远古RNA引导系统:基因编辑疗法的新希望?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

请说一下你对分布式和微服务的理解

分布式系统 定义&#xff1a; 分布式系统由多个独立计算机&#xff08;节点&#xff09;组成&#xff0c;这些节点通过网络通信协作完成任务&#xff0c;对外表现为一个整体。 特点&#xff1a; 分布性&#xff1a;节点分布在不同的物理位置。 并发性&#xff1a;多个节点可…