Kafka 从 0.11 版本开始引入了事务支持。Kafka 的事务可以保证:
- 消息要么全部发送成功,要么全部失败,不会出现部分发送成功的情况。
- 消息要么被所有的消费者消费,要么不被任何消费者消费,不会出现部分消费的情况。
Kafka 事务的主要工作机制是:
- 生产者在发送消息前需要显式开启一个事务,并为该事务指定一个Transactional ID。
- 生产者发送的所有消息都会写入到一个临时日志文件,不会立即复制到Follower和消费者。
- 如果生产者提交事务,Broker 会将临时日志文件中的消息复制到普通日志文件,并删除临时日志文件。消息才会被 Follower 和消费者消费。
- 如果生产者中止事务,Broker 会直接删除临时日志文件。消息不会被复制和消费。
- 消费者在消费消息前会检查其事务状态,只有提交的消息才会被消费。中止的消息不会被消费。
- 同一 Transactional ID 的消息只会被同一个消费组消费。不同消费组之间互不影响。
- 只有主从同步的 Follower 才能消费带事务的消息。异步复制的 Follower 不会消费这些消息。
例如,生产者开启事务后发送消息m1和m2,如果halfway提交事务,那么m1和m2都会被消费。如果中止事务,m1和m2都不会被消费。
例如,消费者A消费带事务的消息,消费者B不会消费同一Transactional ID的消息。两个消费者互不影响。
理解 Kafka 事务的实现机制,可以让我们设计更加严谨稳定的消息生产与消费方案。