分布式事务之可靠消息最终一致性!
分布式事务之可靠消息最终一致性!
月伴飞鱼方案一:依靠MQ的事务消息机制来实现投递消息和参与者⾃身本地事务的⼀致性保障。
消息的可靠发送由发送端
Producer
进行保证(消费端无需考虑),可靠发送消息的步骤如下:
- 发送一个事务消息,RocketMQ将消息状态标记为Prepared,注意此时这条消息消费者是无法消费到的。
- 执行业务代码逻辑,可能是一个本地数据库事务操作。
- 确认发送消息,RocketMQ将消息状态标记为可消费,这个时候消费者,才能真正的保证消费到这条数据。
如果确认消息发送失败了怎么办?
- RocketMQ会定期扫描消息集群中的事务消息,如果发现了Prepared消息,它会向消息发送端(生产者)确认。
- RocketMQ会根据发送端设置的策略来决定是回滚还是继续发送确认消息。
- 这样就保证了消息发送与本地事务同时成功或同时失败。
如果消费失败怎么办?
- 阿里提供的解决方法是:人工解决。
方案二:并不是所有的MQ都支持事务消息。
也就是消息一旦发送到消息队列中,消费者立马就可以消费到,此时可以使用独立消息服务、或者本地事务表。
刚开始处于prepare状态,业务逻辑处理成功后,确认发送消息,这个时候 独立消息服务 才会真正的把消息发送给消息队列。
消费者消费成功后,ack时,除了对消息队列进行ack,对于独立消息服务也要进行ack,独立消息服务一般是把这条消息删除。
而定时扫描prepare状态的消息,向消息发送端(生产者)确认的工作也由独立消息服务来完成。