正文
分布式事务一直是微服务设计的一个难点,是解决业务一致性问题的重要手段,一直很谨慎不敢写这部分内容,担心水平不够弄错误导大家。
但是如果在项目上出现了跨服务的业务一致性需求,在网络上搜索出来的材料往往是一些理论和具体的框架使用,对问题场景的分析不多。
在和多个公司的架构师讨论后,大家的共识是:分布式事务很难有一个通用的解决方案,需要在场景中获得比较好的平衡,往往是捏着鼻子选择最容易接受的方案。
本文从场景和问题出发,讨论分布式事务的实现思路,并对业界常见的概念进行了辨析,用于指导分布式事务方案选择。
常见的最终一致性常见有这些,由简单到复杂:
-
服务之间的调用重试,需要保持一致性。例如,订单提交后需要发送通知。一般通知服务是单独的服务或者产品,因此需要通过一个机制来保证消息一定会被发出。
-
多个业务之间的一致性处理。比如用户在商城消费后,需要异步的完成积分、会员等级的更新等,这类一致性要求没那么严格。
-
账户余额管理。用户消费后需要扣减余额,而订单取消后需要再把余额修改回原来的状态。账户和订单往往在不同的服务,因此需要处理一致性问题。
-
库存一致性。库存一致性问题是供应链领域的核心问题,也是难度最高的分布式问题。和账户余额类似,当时其不同点在于,账户余额的扣减并发很低,没有竞争烈度。而在电商中,库存属于高烈度争用的资源。
这里只选择了一些具有代表性的业务一致性问题,但是我们能发现一些规律。我们可以对有业务一致性要求的问题进行分类,可以大概分为两类:
-
-
大部分情况下,无资源争用的业务一致性很容易被解决,通过重试即可解决。而有资源争用的业务一致性场景却很麻烦,其实可以想办法转换为无资源争用的业务一致性场景,这是我们日常解决一致性问题的核心思想。
这就需要用到一些分布式理论的内容,我们主要聊聊有资源争用的场景如何处理。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
一致性问题其实在生活中非常常见。
比如在中学,语文老师和数学老师都想要占用晚上的自习时间,于是打电话给家里说不回去吃饭后,让各自的课代表通知班上的同学,如果晚上的时间只够一节课,那么一致性问题就出现了。其中一位老师没有回去吃饭,却也不能上课。
当状态分区后,也就是决策者不在一起时,一致性问题必然会出现。
这个问题被描述为众所周知的 CAP 定理:一致性、可用性和分区容忍性只能三选二。
这三个特性的含义为:
-
Consistency:一致性,每个分区的状态保持一致。