kafka的优势其实在于副本机制以及在消息的吞吐量上,它本身的机制并不能用来做分布式事务;
如果非得要用它来做事务管理的话,我们需要自己业务层面自己来确保消息的幂等性
如果非要用kafka实现一个分布式事务,则需要借助一个本地事务状态表来实现,过程如下:
- 业务操作和消息记录在一个事务中,先标记为待发送(发生的消息需携带唯一id)
- 启动一个定时任务定时扫描待发送的消息投递到kafka, 成功后将状态更新为已发送;
- 若失败则重新投递,失败重试前根据消息id及状态判断是否需要重试
- 消费者收到消息后,将消息消息更新为待处理
- 执行消费端的本地事务,成功后将状态改为已处理
- 若消费失败,则定时扫描待处理的消息,重试失败的业务操作或触发回滚的逻辑
根据最终一致性来保障消息的可靠性