下单一致性问题的解决与讨论

Posted 明天会更好new

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了下单一致性问题的解决与讨论相关的知识,希望对你有一定的参考价值。

今天遇到一个问题,下单报错了但是积分还是扣掉了,正常的话没有下单成功,积分不能扣,如何解决呢?

实际问题限制是比较多的,扣积分方法是远程调用的,并且不是我负责的不能修改。

如果单纯的使用数据库,简单,事务,回滚!轻轻松松,但是这里不行,我但是第一反应也是不行,远程调用回滚不了。

还能怎么办?如果都是我负责的我可以修改下单方法也可以修改积分方法,可以使用分布式事务!

参考:整理分布式事务“下订单”逻辑

很复杂,如果原有代码没有任何分布式事务处理,从零开始做一时半会完不成,更何况现在只能改本地服务,积分服务不能改。

公布答案,实际上面的描述有一个潜在条件,远程服务没有问题,有问题的是本地服务,在调用完积分服务之后,后面的代码报错了。

所以最根本的方法是修改代码逻辑,让积分服务在下单方法的最下面调用,需要解决的是下面代码对积分服务返回值的依赖,如果确实有依赖,可以考虑使用分布式事务,但是这样做是本地和远程都要改,可以作为大杀器。

分布式事务的逻辑是借助mq、定时任务,手动ack。在这个场景我想的分布式事务解决方案是,将扣积分作为消息发送,消费者也就是积分服务进行处理,在下单的最后进行ack,如果没有ack也就是超时,积分服务进行回滚!

以上是关于下单一致性问题的解决与讨论的主要内容,如果未能解决你的问题,请参考以下文章

下单一致性问题的解决与讨论

微信公众号支付-下单账号与付款账号不一致问题解决

下单场景下的分布式

微信提示支付帐号与下单账户不一致,付款不了怎么办?

扫码下单与ERP客户端锁桌功能FAQ

主从DB与cache一致性