下单一致性问题的解决与讨论
Posted 明天会更好new
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了下单一致性问题的解决与讨论相关的知识,希望对你有一定的参考价值。
今天遇到一个问题,下单报错了,但是积分还是扣掉了,正常的话没有下单成功,积分不能扣,如何解决呢?
实际问题限制是比较多的,扣积分方法是远程调用的,并且不是我负责的不能修改。
如果单纯的使用数据库,简单,事务,回滚!轻轻松松,但是这里不行,我但是第一反应也是不行,远程调用回滚不了。
还能怎么办?如果都是我负责的我可以修改下单方法也可以修改积分方法,可以使用分布式事务!
很复杂,如果原有代码没有任何分布式事务处理,从零开始做一时半会完不成,更何况现在只能改本地服务,积分服务不能改。
公布答案,实际上面的描述有一个潜在条件,远程服务没有问题,有问题的是本地服务,在调用完积分服务之后,后面的代码报错了。
所以最根本的方法是修改代码逻辑,让积分服务在下单方法的最下面调用,需要解决的是下面代码对积分服务返回值的依赖,如果确实有依赖,可以考虑使用分布式事务,但是这样做是本地和远程都要改,可以作为大杀器。
分布式事务的逻辑是借助mq、定时任务,手动ack。在这个场景我想的分布式事务解决方案是,将扣积分作为消息发送,消费者也就是积分服务进行处理,在下单的最后进行ack,如果没有ack也就是超时,积分服务进行回滚!
以上是关于下单一致性问题的解决与讨论的主要内容,如果未能解决你的问题,请参考以下文章