深入理解Kafka事务

一 kafka事务介绍

1.1 Kafka事务的作用

  • Exactly-Once Semantics (EOS):在“消费 → 处理 → 生产”的流式链路里避免重复写重复读带来的副作用,确保“处理一次且仅一次”的可见效果。

  • 跨分区 / 跨 Topic 原子性:将一次处理内写入的多分区多主题消息,以及本次消费位点 offset 的提交,绑定在同一个事务里,要么都生效,要么都回滚。

1.2 相关术语

  • PID / Producer IDEpochSequence Number:幂等生产者元数据,避免重复写。

  • 事务协调器(Transaction Coordinator):位于 broker 侧的协调者,管理事务状态机与两阶段提交。

  • 控制批次(Control Batch / Control Records):日志里的特殊记录,用于标记事务,主要是 COMMIT / ABORT(注意:数据分区不写“BEGIN”标记)。

  • LSO(Last Stable Offset)HW(High Watermark):对 read_committed 消费者只暴露到 LSO,屏蔽未决事务。

  • __transaction_state:kafka内部主题,用于持久化事务状态机。

  • __consumer_offsets:kafka内部主题,存消费组位点;位点也可以被纳入事务。

  • 僵尸实例:一个旧的 Producer 实例(带着同样的 transactional.id)在崩溃或网络分区后挂掉了,但它可能在恢复后继续尝试往 Kafka 写数据,但是与此同时,已经有一个新的 Producer 实例已经起来并接管了同样的 transactional.id,我们把这个宕机后又恢复的producer叫做僵尸实例

1.3 消费者隔离级别

消费者的隔离级别有下面两种

  • read_uncommitted(默认):可读到未提交已提交数据。

  • read_committed:只读取已提交事务的数据(EOS 流水线应使用)。

假设想要配置消费者隔离级别为read_committed,可通过下面配置完成

props.put("isolation.level", "read_committed");

二、使用 Kafka 事务

2.1 生产者端配置

Properties props = new Properties(); 
// broker地址
props.put("bootstrap.servers", "broker1:9092,broker2:9092"); 
// transactional.id 必须唯一且稳定(可复用)
props.put("transactional.id", "order-service-txn-1");  
// 配了 transactional.id 会自动开启,但是最好还是显式配置
props.put
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值