专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  再见了SpringBoot,后端AI已成气候! ·  21 小时前  
芋道源码  ·  Java面试,问八股文的面试官水平很次? ·  昨天  
芋道源码  ·  抱歉,最近我劝各位真的别轻易离职...... ·  2 天前  
芋道源码  ·  if 判断泛滥?试一试规则执行器,太香了! ·  2 天前  
51好读  ›  专栏  ›  芋道源码

分布式事务场景、概念和方案整理

芋道源码  · 公众号  · Java  · 2025-05-12 09:30

正文

请到「今天看啥」查看全文


  • TCC
  • JTA/XA
  • 二阶段、三阶段
  • SAGA 模式
  • AT 模式
  • 分布式事务实现的选择和要点
  • 总结
  • 参考资料

  • 分布式事务一直是微服务设计的一个难点,是解决业务一致性问题的重要手段,一直很谨慎不敢写这部分内容,担心水平不够弄错误导大家。

    但是如果在项目上出现了跨服务的业务一致性需求,在网络上搜索出来的材料往往是一些理论和具体的框架使用,对问题场景的分析不多。

    在和多个公司的架构师讨论后,大家的共识是:分布式事务很难有一个通用的解决方案,需要在场景中获得比较好的平衡,往往是捏着鼻子选择最容易接受的方案。

    本文从场景和问题出发,讨论分布式事务的实现思路,并对业界常见的概念进行了辨析,用于指导分布式事务方案选择。

    有哪些常见的分布式事务场景?

    常见的最终一致性常见有这些,由简单到复杂:

    1. 服务之间的调用重试,需要保持一致性。例如,订单提交后需要发送通知。一般通知服务是单独的服务或者产品,因此需要通过一个机制来保证消息一定会被发出。
    2. 多个业务之间的一致性处理。比如用户在商城消费后,需要异步的完成积分、会员等级的更新等,这类一致性要求没那么严格。
    3. 账户余额管理。用户消费后需要扣减余额,而订单取消后需要再把余额修改回原来的状态。账户和订单往往在不同的服务,因此需要处理一致性问题。
    4. 库存一致性。库存一致性问题是供应链领域的核心问题,也是难度最高的分布式问题。和账户余额类似,当时其不同点在于,账户余额的扣减并发很低,没有竞争烈度。而在电商中,库存属于高烈度争用的资源。

    这里只选择了一些具有代表性的业务一致性问题,但是我们能发现一些规律。我们可以对有业务一致性要求的问题进行分类,可以大概分为两类:

    1. 无资源争用的业务一致性场景。
    2. 有资源争用的业务一致性场景。

    大部分情况下,无资源争用的业务一致性很容易被解决,通过重试即可解决。而有资源争用的业务一致性场景却很麻烦,其实可以想办法转换为无资源争用的业务一致性场景,这是我们日常解决一致性问题的核心思想。

    这就需要用到一些分布式理论的内容,我们主要聊聊有资源争用的场景如何处理。

    基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

    • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
    • 视频教程:https://doc.iocoder.cn/video/

    分布式事务的理论基础和分析

    一致性问题其实在生活中非常常见。

    比如在中学,语文老师和数学老师都想要占用晚上的自习时间,于是打电话给家里说不回去吃饭后,让各自的课代表通知班上的同学,如果晚上的时间只够一节课,那么一致性问题就出现了。其中一位老师没有回去吃饭,却也不能上课。

    当状态分区后,也就是决策者不在一起时,一致性问题必然会出现。

    这个问题被描述为众所周知的 CAP 定理:一致性、可用性和分区容忍性只能三选二。

    这三个特性的含义为:

    • Consistency:一致性,每个分区的状态保持一致。






    请到「今天看啥」查看全文