怎么实现分布式消息事务的?半消息?
怎么实现分布式消息事务的?半消息?
半消息是指生产者成功发送到Broker端的消息,但暂时不能被消费者消费的消息。它被标记为"暂不可投递"状态,只有在生产者执行完本地事务并进行二次确认后,消费者才能消费该消息。
使用半消息可以实现分布式消息事务,其中关键在于二次确认和消息回查的机制:
- 生产者向Broker发送半消息。
- 生产者收到响应,消息发送成功,此时消息处于半消息状态,标记为"不可投递",消费者无法消费。
- 生产者执行本地事务。
- 若本地事务正常执行完成,生产者向Broker发送Commit/Rollback消息。如果是Commit,Broker将半消息标记为正常消息,消费者可以消费;如果是Rollback,Broker将丢弃此消息。
- 若出现异常情况,Broker在一定时间后仍未收到二次确认。此时,Broker会查询所有半消息,并向生产者查询半消息的执行情况。
- 生产者查询本地事务的状态。
- 根据事务状态,将Commit/Rollback提交到Broker。(此过程为消息回查)
- 消费者在消费消息时执行本地事务。