目录
- 一、Kafka 的事务和 Exactly Once 可以解决什么问题
- 1.1、Kafka 的事务
- 1.2、Kafka 中的 Exactly Once 又是解决的什么问题
- 二、Kafka 的事务是如何实现的
- 2.1、Kafka 事务的实现原理
- 2.2、Kafka 事务的实现流程
- 三、小结
- 3.1、Kafka 和 RocketMQ 它们在实现事务共同点
- 3.2、Kafka 和 RocketMQ 它们在实现事务不同点
一、Kafka 的事务和 Exactly Once 可以解决什么问题
1.1、Kafka 的事务
- Kafka 的事务解决的问题和 RocketMQ 是不太一样的。RocketMQ 中的事务,它解决的问题是,确保执行本地事务和发消息这两个操作,要么都成功,要么都失败。并且,RocketMQ 增加了一个事务反查的机制,来尽量提高事务执行的成功率和数据一致性。
- 而 Kafka 中的事务,它解决的问题是,确保在一个事务中发送的多条消息,要么都成功,要么都失败。注意:这里面的多条消息不一定要在同一个主题和分区中,可以是发往多个主题和分区的消息。当然,你可以在 Kafka 的事务执行过程中,加入本地事务,来实现和 RocketMQ 中事务类似的效果,但是 Kafka 是没有事务反查机制的。
- Kafka 的这种事务机制,单独来使用的场景不多。更多的情况下被用来配合 Kafka 的幂等机制来实现 Kafka 的 Exactly Once 语义。我在之前的章节中也强调过,这里面的 Exactly Once,和我们通常理解的消息队列的服务水平中的 Exactly Once 是不一样的。
- 我们通常理解消息队列的服务水平中的 Exactly Once,它指的是,消息从生产者发送到 Broker,然后消费者再从 Broker 拉取消息,然后进行消费。这个过程中,确保每一条消息恰好传输一次,不重不丢。我们之前说过,包括 Kafka 在内的几个常见的开源消息队列,都只能做到 At Least Once,也就