Kafka 事务
Kafka 的事务机制,就是让 Producer 往 多个分区 / 多个 Topic 写消息时,看起来像一个“数据库事务”:
- 要么这批写入全部生效(commit)
- 要么这批写入全部作废(abort)
- 不会出现“写了一半”的中间状态被 Consumer 看到。
这个事务是对外表现的事务
Producer 事务
为了是实现跨会话跨partition的事务,这时候需要引入一个事务协调者,将PID(producer ID)与Transition关联起来。这样重启的时候,就不会重新分配新的PID,而是通过正在进行的TransitionId 获取原来的 PID。
还有就是,事务协调者会将事务状态写入一个 topic里,这样的话即使整个服务重启,事务的状态也会得到保存,从而得到延续
整个流程
1 | producer.beginTransaction(); |
这时候会先开启事务
如果producer全部写入,事务协调者就会往事务topic里写入一个maker消息
如果producer写一半宕机了,因为我们是会设置事务超时时间,且broker和producer之间会有心跳,如果
broker收不到producer的心跳包了,那么就会写入一个abort消息
Consumer 事务
Consumer的事务就比较弱, 无法保证commit的消息被准确地消费