泪伤荡的编程指南 泪伤荡的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM篇
  • 新特性
  • 进阶篇
  • 网络
  • 操作系统
  • 数据结构与算法
  • 硬件
  • 基础篇
  • MySql
  • Oracle
  • PostgreSQL
  • 达梦
  • Redis
  • Mongodb
  • Hive
  • 数据库比较
  • Spring
  • SpringMvc
  • SpringBoot
  • Hibernate
  • iBatis
  • Mybatis
  • Mybatis-plus
  • Mybatis-plus-join
  • 各个框架对比
  • UML画图
  • 设计须知
  • 开发流程
  • 开发理论
  • 架构体系
  • 设计模式
  • 开源知识
  • 分布式解决方案
  • SpringCloud
  • API网关
  • 注册中心
  • 配置中心
  • 服务调用
  • 分布式事务
  • 消息队列
  • 调度作业
  • 链路追踪
  • 服务保障
  • 搜索引擎Elk
  • 安全框架
  • 监控体系
  • 部署容器
  • Netty
  • Tomcat
  • Nginx
  • 图片云存储
  • 云存储
  • 虚拟机Linux
  • 项目部署
  • 容器部署
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • Bug记录仓库
  • 随笔
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 视频网站
  • 音乐网站
  • 商城网站
  • 论坛网站
  • scrm项目
  • Yudao-cloud
  • RuoYi-Vu-cloud
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • Java术语
  • 命名英语
  • 业务英语
  • 表字段英语
  • 包名英语
Github (opens new window)
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM篇
  • 新特性
  • 进阶篇
  • 网络
  • 操作系统
  • 数据结构与算法
  • 硬件
  • 基础篇
  • MySql
  • Oracle
  • PostgreSQL
  • 达梦
  • Redis
  • Mongodb
  • Hive
  • 数据库比较
  • Spring
  • SpringMvc
  • SpringBoot
  • Hibernate
  • iBatis
  • Mybatis
  • Mybatis-plus
  • Mybatis-plus-join
  • 各个框架对比
  • UML画图
  • 设计须知
  • 开发流程
  • 开发理论
  • 架构体系
  • 设计模式
  • 开源知识
  • 分布式解决方案
  • SpringCloud
  • API网关
  • 注册中心
  • 配置中心
  • 服务调用
  • 分布式事务
  • 消息队列
  • 调度作业
  • 链路追踪
  • 服务保障
  • 搜索引擎Elk
  • 安全框架
  • 监控体系
  • 部署容器
  • Netty
  • Tomcat
  • Nginx
  • 图片云存储
  • 云存储
  • 虚拟机Linux
  • 项目部署
  • 容器部署
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • Bug记录仓库
  • 随笔
  • HTML与CSS
  • JS学习
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 视频网站
  • 音乐网站
  • 商城网站
  • 论坛网站
  • scrm项目
  • Yudao-cloud
  • RuoYi-Vu-cloud
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
  • Java术语
  • 命名英语
  • 业务英语
  • 表字段英语
  • 包名英语
Github (opens new window)
  • API网关

    • 网关基础知识小结
    • Gateway官方文档学习
  • 消息队列

    • RocketMQ

      • RocketMQ入门
      • SpringBoot整合RocketMQ
      • RocketMQ5.1.2源码解析
    • Kafka

      • Kafka基础小结
      • Kafka的下载安装以及使用
      • Kafka整合SpringBoot
      • Kafka可视化工具
  • Spring Cloud

    • Spring Cloud Alibaba 从入门到实战

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

    • 认识Seata
  • 云存储

    • minio
  • 搜索引擎

    • Elasticsearch入门
  • 虚拟机

    • Linux基础小结
    • Linux环境搭建
    • 安装Docker
    • Docker入门
    • 配置桥接模式
    • 防火墙相关
    • 查看日志的六种命令详解
    • docker run指令
  • 微服务
  • 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/10/26 02:01:17
分布式消息(事件)驱动
SpringCloud Stream学习

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

Theme by Vdoing | Copyright © 2024-2025 泪伤荡 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式