分布式事务解决方案之可靠消息最终一致性

可靠消息最终一致性事务

​ 可靠消息:消息从事务的发起方发送到事务的参与方

​ 最终一致:消息发起方必须保证消息发送成功,消息的参与方则保证消息的接受成功

事务发起方
网络1
消息中间件
网络2
事务接收方
  • 本地事务与消息发送的原子性
    	begin transaction
    	发送MQ
    	数据库操作
    	commit;
    此方式无法保证事务的一致性。消息发送成功后,数据库操作回滚,消息不能被退回。
    
    	begin transaction
    	数据库操作
    	发送MQ
    	commit;
    此方式虽然在消息放松失败抛出异常后数据库会回滚,但当消息是超时异常,导致数据库回滚。这时其实消息已经发送成功,导致事务不一致。
    
  • 事务参与方接受消息的可靠性
    事务的参与方必须能够从消息队列接收到消息。假如接收消息失败可以重复接收消息(重试)。
    
  • 消息重复消费
    由于网络的原因,若某一个消费节点超时但消费成功,此时消息中间件会重复投递此消息,就导致了消息的重复消费。
    	需要解决事务参与方的方法幂等性
    
方案
1. 本地消息表
原理示例
1. 新增订单付款
2. 本地数据库增加消息表并存储库存扣减消息日志
=======================================
订单表、消息表必须在同一个数据库,保证其本地事务原子性
=======================================
3. 定时任务扫描消息表发送消息给MQ
---------------------------------------
4. 中间件MQ将消息推送给库存服务,库存服务接收到消息,需要ACK机制回复确认。
5. 扣减订单服务相应的库存数量
2. RocketMQ事务消息
原理示例
1. 事务发起方会给RocketMQ发送扣减库存消息
2. RocketMQ会给事务发起方回应成功接收到消息
		此时的消息状态是不可被消费状态
3. 执行本地事务新增订单付款操作
4. 本地事务成功执行会给RocketMQ发送Commit
		失败会发送Rollback
5. RocketMQ会将接收到的消息状态更改为可消费状态
		接收到Rollback,会将消息从队列中删除
6. 订单服务接收到消息后扣减库存

问题点:
1. 消息发送成功但是不可消费状态时,事务发起方和MQ中断连接。该消息如何处理
		MQ在未收到事务发起方的回应时,会定时检查该消息的事务状态,根据事务的状态处理该消息。同5步骤
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值