Kafka中的事务是如何保证的?

Kafka 从 0.11 版本开始引入了事务支持。Kafka 的事务可以保证:

  1. 消息要么全部发送成功,要么全部失败,不会出现部分发送成功的情况。
  2. 消息要么被所有的消费者消费,要么不被任何消费者消费,不会出现部分消费的情况。

Kafka 事务的主要工作机制是:

  1. 生产者在发送消息前需要显式开启一个事务,并为该事务指定一个Transactional ID。
  2. 生产者发送的所有消息都会写入到一个临时日志文件,不会立即复制到Follower和消费者。
  3. 如果生产者提交事务,Broker 会将临时日志文件中的消息复制到普通日志文件,并删除临时日志文件。消息才会被 Follower 和消费者消费。
  4. 如果生产者中止事务,Broker 会直接删除临时日志文件。消息不会被复制和消费。
  5. 消费者在消费消息前会检查其事务状态,只有提交的消息才会被消费。中止的消息不会被消费。
  6. 同一 Transactional ID 的消息只会被同一个消费组消费。不同消费组之间互不影响。
  7. 只有主从同步的 Follower 才能消费带事务的消息。异步复制的 Follower 不会消费这些消息。

例如,生产者开启事务后发送消息m1和m2,如果halfway提交事务,那么m1和m2都会被消费。如果中止事务,m1和m2都不会被消费。

例如,消费者A消费带事务的消息,消费者B不会消费同一Transactional ID的消息。两个消费者互不影响。

理解 Kafka 事务的实现机制,可以让我们设计更加严谨稳定的消息生产与消费方案。