← 每日面试题 学习看板

Kafka支持事务消息吗?如何实现的?

面试题/03数据库中间件/06MQ/01Kafka/Kafka支持事务消息吗?如何实现的?.md

面试记录 2026-09-22

题目:Kafka 支持事务消息吗?如何实现的?

难度:medium

标签:db/mq/kafka, mq/kafka, general/knowledge, difficulty/medium

评分:⭐☆☆☆☆(1/5)

我的回答

Kafka 自身是没有做事务消息的实现,如果想要做事务消息,其实是需要相关自行去通过业务以及 Kafka 本地的落盘处理。所谓事务消息,就是一个事物,一个消息发送成功或者失败,都会给返回。这时首先生产者发送消息的时候,一定要配置 ask 的等处,就是一定要收到回答才确认这条消息完成。另外,当消息收到完成之后。 Broker 要通过多分区认证,然后确保这个数据已经落到盘上,保证持久化这条消息。而在消费者端,这条消息不能设置自动回答、自动提交,而是需要业务完成之后手动提交,否则进行重试。

点评

优点:

不足:

补充(本题的正确答案):

Kafka 事务 = Producer 幂等 + Kafka 内部 offset 提交原子化

核心场景:Kafka Streams 消费 A Topic、处理后写入 B Topic,同时提交消费 offset——这三件事必须原子化,否则崩溃重启会重复处理或漏处理。

API 使用:

producer.initTransactions();  // 初始化
producer.beginTransaction();  // 开始
producer.send(message1);      // 写消息
producer.sendOffsetsToTransaction(offsets, groupId);  // 提交消费位点
producer.commitTransaction(); // 原子提交

关键配置:

底层机制:

事务消息 ≠ 消息不丢:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察是否真正理解 Kafka 事务消息的存在、场景和机制——这不是"业务自行实现"的伪命题,而是 Kafka 0.11 之后的原生能力。

知识点拆解:

  1. Kafka 事务从 0.11 开始支持(Confluent 2016 年推出)
  2. 事务的核心目标:让"多个 Topic 写入 + Consumer offset 提交"作为一个原子操作
  3. 典型场景:
  1. API 使用:
  1. 底层实现:
  1. 与 Exactly-Once 的关系:
事务消息不是"发消息成功/失败",而是"多个操作要么全成要么全不成"。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. Kafka 事务消息和 RocketMQ 事务消息有什么区别?
  1. 事务消息能保证外部存储(MySQL)也原子提交吗?
  1. transaction.timeout.ms 超时会怎样?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,Kafka 从 0.11 版本开始就原生支持事务消息,不是需要业务自行实现的。

Kafka 事务的核心目标是让"多个 Topic 写入 + Consumer offset 提交"作为一个原子操作。典型场景比如 CDC,Debezium 消费数据库变更写入 Kafka,同时提交消费位点,这三件事必须原子化,否则崩溃重启会重复处理或漏处理。

使用方式很简单:Producer 初始化时调用 initTransactions,然后 beginTransaction,写入消息和消费 offset,最后 commitTransaction 一次性提交。关键 API 是 sendOffsetsToTransaction,把消费 offset 加入事务,这样提交事务时消费位点也会一并提交。

底层实现上,Producer 用 transactional.id 从 Broker 换取 PID(Producer ID),保存在 __transaction_state 这个内部 Topic 里。事务开始时向该 Topic 写 begin 记录,提交时写 commit 记录。Consumer 端配置 isolation.level=read_committed,只读已提交事务的消息。

需要澄清一个概念:事务消息 ≠ 消息不丢。消息不丢靠的是 acks=all + ISR + 手动 commit;事务消息靠的是 transactional.id + Kafka 内部事务 Topic,实现"多操作原子化"。

另外 Kafka 事务只能解决 Kafka 内部的 Exactly-Once,外部存储(如 MySQL)还是要业务侧配合事务或最终一致性方案。

与 RocketMQ 事务消息对比:Kafka 事务范围限于 Kafka 内部,靠 transactional.id 和 __transaction_state Topic;RocketMQ 用 Half 消息加回查机制,事务消息与业务服务交互,可以感知业务侧的确认。


面试记录 2026-10-12(第 2 次)

题目:Kafka 支持事务消息吗?如何实现的?

难度:medium

标签:db/mq/kafka, mq/kafka, difficulty/medium

评分:⭐⭐⭐☆☆(3/5)(较上次 1/5 有明显进步)

练习次数:2

我的回答

Kafka 自身是支持事务消息的。

它的事务消息是基于它自身的,有一个 Transaction log 的一个 topic。

当开启事务消息的时候,使用事务 ID,每个事务消,每个消息生成一事务 ID,事务 ID 作为发送这个消息的标识。当多消息进行分区消费的时候,大家都消费完成了,然后把对应的消费结果是成功或者是成功或者是失败返回给 Broker,Broker 进行 transaction log 的记录,然后其他的消费者根据这个记录去判定是否进,判定是否能看到对应的消息。如果是 commit 就可以看到,也就是消费成功就可以看到。如果是 rollback 要回滚,则对应的消息不可见。

点评

优点:

不足:

补充:

ℹ️ 完整讲解见上方首次记录(2026-09-22)