Kafka 事务

Kafka 的事务机制,就是让 Producer 往 多个分区 / 多个 Topic 写消息时,看起来像一个“数据库事务”:

  • 要么这批写入全部生效(commit)
  • 要么这批写入全部作废(abort)
  • 不会出现“写了一半”的中间状态被 Consumer 看到。

这个事务是对外表现的事务

Producer 事务

为了是实现跨会话跨partition的事务,这时候需要引入一个事务协调者,将PID(producer ID)与Transition关联起来。这样重启的时候,就不会重新分配新的PID,而是通过正在进行的TransitionId 获取原来的 PID。

还有就是,事务协调者会将事务状态写入一个 topic里,这样的话即使整个服务重启,事务的状态也会得到保存,从而得到延续

整个流程

1
2
3
4
producer.beginTransaction();
producer.send(record_to_order);
producer.send(record_to_stock);
producer.commitTransaction(); // or abortTransaction()

这时候会先开启事务

如果producer全部写入,事务协调者就会往事务topic里写入一个maker消息

如果producer写一半宕机了,因为我们是会设置事务超时时间,且broker和producer之间会有心跳,如果

broker收不到producer的心跳包了,那么就会写入一个abort消息

Consumer 事务

Consumer的事务就比较弱, 无法保证commit的消息被准确地消费