沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • API网关

  • RPC

  • 消息队列

  • Spring Cloud

    • Spring Cloud Alibaba 从入门到实战

      • 基础知识篇
      • 分布式配置
      • 服务注册与发现
      • 分布式服务调用
      • 服务熔断和限流
      • 分布式消息(事件)驱动
      • 分布式事务
        • 1、简介
        • 2、学习目标
        • 3、为什么需要分布式事务?
        • 4、常见的分布式事务解决方案
          • 消息最终一致性
          • XA
          • TCC
          • Saga
          • 总结
        • 5、AT 事务模式
        • 6、Seata 与 Spring Cloud 集成
        • 7、如何扩展一个 RPC 框架?
        • 8、实战样例
        • 参考书籍
    • SpringCloud Stream学习
    • Nacos学习
  • 分布式事务

  • 云存储

  • 搜索引擎

  • 多媒体框架

  • 虚拟机

  • 微服务
  • Spring Cloud
  • Spring Cloud Alibaba 从入门到实战
沉梦听雨
2023-09-26
目录

分布式事务

# 分布式事务

官方文档:Seata (opens new window)

# 1、简介

分布式一致性是分布式系统需解决的关键问题之一,在微服务的实践中分布式事务是用户遇到的最大痛点。

Seata 在阿里经济体内部经过了漫长的孵化,承载了双 11 洪荒流量,实践证明 Seata 是一款解决分布式数据一致性的的优秀组件。

Seata 除了提供了独创的 AT 事务模式外,还扩展了 TCC、Saga 和 XA 事务模式,满足大家对于不同业务场景中的需求。

# 2、学习目标

  1. 理解分布式事务在业务中的核心使用场景和常用解决方案
  2. 理解 Seata AT 事务模式的核心原理
  3. 掌握 Seata 作为分布式事务组件与 Spring Cloud 的整合
  4. 如何扩展一个 RPC 框架
  5. Seata 实战

# 3、为什么需要分布式事务?

前言

分布式事务不是在新架构下产生的新问题,即使在单体应用中同样存在着分布式事务问题,典型的场景是单体应用执行方法中含有多个数据源。

X/OPEN 对于这一问题,提出了含有三种角色的 DTP(Distributed Transaction Processing)模型并形成了 XA 规范来解决此问题。

各厂商针对 XA 规范做了具体的实现,也就是大家常说的 XA 协议。在 Java 体系中基于 DTP 模型提出了 JTA 规范,定义了分布式事务中的【事务管理器(TM)】与【资源管理器(RM)】、【应用程序(AP)】等的 Java 接口。

在 Java EE 时代,应用服务器如 weblogic 充当了 TM 的角色,而传统关系数据库通过实现 XA 协议充当了 RM 的角色。

原因

微服务架构的引入使分布式数据一致性问题更为突出,由原来的单体应用拆分出来几十甚至上百个微服务。

  • 如何保证服务间的一致性?
  • 当在一条较长的微服务调用链中,位于中间位置的微服务节点出现异常,如何保证整个服务的数据一致性?

业务的本质体现在数据上,数据不一致的直接后果是可能产生资损,更严重的是如果不一致的数据不能被及时发现,业务再次基于此数据的进行相关逻辑操作,会进一步导致数据错上加错,最终很难溯源。

# 4、常见的分布式事务解决方案

从是否满足事务 ACID 特性上,我们可以将事务分为两大类:刚性事务和柔性事务。

在常见解决方案中:

  1. XA 事务属于刚性事务解决方案,
  2. 而其他的大多数解决方案如 TCC、 Saga、消息最终一致性则属于柔性事务解决方案。

# 消息最终一致性

消息最终一致性方案是在 Seata 问世之前,市面上应用最广泛的一种解决方案。

优点

它本身具有削峰填谷,可异步化的优点,更多的适应于可异步化的末端链路消息通知场景。

缺点

但是它本身也存在着一些缺点:

  1. 需要依赖可靠消息组件,消息的可靠性很重要,大多数的原生消息组件故障时很难降级;
  2. 实时性比较差,要经过多次网络 IO 开销和持久化,遇到队列积压情形实时性不可控;
  3. 无法保证隔离性,在已发送消息和消息消费之前,中间数据对外可见,无法满足事务 isolate 特性;
  4. 只能向前重试不可向后回滚,消息消费无法成功时无法回滚消息生产侧的数据;
  5. 无法保证多条消息间的数据一致性。

# XA

在工业界使用 XA 落地方案的相对较少,主要集中在应用服务器的场景。

XA 方案要求相关的厂商提供其具体协议的实现,目前大部分关系数据库支持了 XA 协议。

XA 方案被人诟病的是其性能,其实更为严重的是对于连接资源的占用,导致在高并发未有 足够的连接资源来响应请求成为系统的瓶颈。

# TCC

# Saga

# 总结

上面提到了 4 种常用的分布式事务解决方案,Seata 集成了 TCC、Saga 和 XA 方 案。另外,Seata 还提供了独创的 AT 强一致分布式事务解决方案。

# 5、AT 事务模式

一个分布式事务有全局唯一的 xid,由若干个分支事务构成,每个分支事务有全局唯一的 branchId。

# 6、Seata 与 Spring Cloud 集成

从代码上可以分为三大部分:rest、feign 和 web。AutoConfiguration 结尾的类是 @Configuration 类被 spring.factories 加载,负责创建 package 中所属的 bean。

# 7、如何扩展一个 RPC 框架?

主要可以分为两大部分:

  1. 事务上下文传递
  2. 事务上下文绑定和清除

具体 API 参考官方文档:Seata api (opens new window)

# 8、实战样例

地址:seata/seata-samples: seata-samples (github.com) (opens new window)

# 参考书籍

重磅下载 | Java 开发者必备手册《Spring Cloud Alibaba 从入门到实战》,阿里双11同款!-阿里云开发者社区 (aliyun.com) (opens new window)

上次更新: 2024/9/25 11:16:13
分布式消息(事件)驱动
SpringCloud Stream学习

← 分布式消息(事件)驱动 SpringCloud Stream学习→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式