首页 > 其他分享 >分布式事务解决方案——Seata

分布式事务解决方案——Seata

时间:2023-08-25 10:58:09浏览次数:33  
标签:事务 Seata 解决方案 db nacos 分布式 config seata

分布式事务解决方案——Seata

Seata是什么?

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

Seata三大角色

在Seata架构中,共涉及到三个角色:

  • TC(Transaction Conrdinator)-事务协调者

​ 维护全局和分支事务的状态,驱动全局事务提交或回滚。

  • TM(Transaction Manager)- 事务管理器

​ 定义全局事务的范围:开始全局事务,提交或回滚全局事务

  • RM(Resource Manager)- 资源管理器

​ 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中TC为单独部署的Server服务端,TM和RM为嵌入到应用的Client客户端。

AT模式

前提

  • 基于本地ACID事务的关系型数据库
  • Java应用,通过JDBC访问数据库

AT模式是一种无侵入的分布式事务解决方案,该模式下,用户只需关注自己的业务SQL,用户的业务SQL作为一阶段,Seata框架会自动生成事务的二阶段提交和回滚操作。

image.png

  • 一阶段:

    • Seata会连接业务代码,解析SQL语义。
    • 执行业务代码要更新的业务数据,在业务数据被更新前,将其保存为“before image
    • 执行业务SQL,更新业务数据
    • 查询更新后的数据,将其保存成"after image"
    • 生成行锁

    以上操作全部在一个数据库事务内完成,保证了一阶段操作的原子性

图片3.png

  • 二阶段(提交)

    • 因为业务SQL在一阶段已经提交至数据库,所以Seata框架只需将一阶段保存的快照数据和行锁删除,完成数据清理即可。

    图片4.png

  • 三阶段(回滚)

    • 校验脏写

      • 首先要校验脏读,对比“数据库当前业务数据”和“after image”。
      • 如果两份数据完全一致就说明没有脏读,可以还原业务数据。
      • 如果不一致,说明有脏写,出现脏写就需要转人工处理。
    • 还原数据

      • 用"before image"还原业务数据
    • 删除快照数据和行锁

    图片5.png

设计亮点

相比较其他分布式事务框架,Seata架构的亮点如下:

  1. 应用层基于SQL解析实现了自动补偿,从而最大程度的降低业务侵入性。
  2. 将分布式事务中TC(事务协调者)独立部署,负责事务的注册、回滚。
  3. 通过全局锁实现了写隔离和读隔离。

Seata 快速开始

Seata 安装包下载

链接:https://github.com/seata

注意:选择的Seata版本最好与Spring Cloud版本匹配对应,版本说明文档地址

image-20230824102250798

本文使用Mac环境下seata-server1.3.0进行部署说明

https://github.com/seata/seata/releases/tag/v1.3.0

![image-20230824102726876](/Users/zhangshao/Library/Application Support/typora-user-images/image-20230824102726876.png)

事务信息存储配置

server端存储模式(store.model)支持如下三种方式:

  • File

​ 单机模式(默认为此模式),全局事务会话信息存储在内存中,读写并持久化至本地文件root.data(bin/sessionStore/root.data)中,性能较高

~/java_tools/seata/bin/sessionStore/root.data

  • db

​ 高可用模式(MySQL5.7+),全局事务会话信息通过db共享,性能较差一些。

  • redis

Seata-server 1.3及以上版本支持,性能较高,但存在事务信息丢失风险,需配合redis持久化配置策略。

本次使用File单机模式进行启动配置,db模式在补充部分介绍。

进入bin目录,执行./seata-server.sh

Seata Client代码实现

业务场景:

用户下单,整个业务逻辑由两个服务系统组成。

订单服务:根据采购需要创建订单

库存系统:对给定的商品扣减库存数量。

img

配置微服务整合Seata

  • 添加pom依赖
<!-- 添加 seata-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR8</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  • 在各服务对应的数据库中添加undo_log表
CREATE TABLE `undo_log` (
                            `id` bigint(20) NOT NULL AUTO_INCREMENT,
                            `branch_id` bigint(20) NOT NULL,
                            `xid` varchar(100) NOT NULL,
                            `context` varchar(128) NOT NULL,
                            `rollback_info` longblob NOT NULL,
                            `log_status` int(11) NOT NULL,
                            `log_created` datetime NOT NULL,
                            `log_modified` datetime NOT NULL,
                            PRIMARY KEY (`id`),
                            UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  • 添加事务分组
  • 配置seata的注册中心

具体 yaml配置如下

server:
  port: 8086

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db_product
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root123456

  cloud:
    alibaba:
      seata:
        # 这里需要与seata.service.vGroup-mapping保持一致,
        tx-service-group: seata-product 
  application:
    name: seata-product

seata:
  service:
    vgroup-mapping:
      seata-product: default

    grouplist:
      default: 127.0.0.1:8091

在方法上添加@GlobalTranscational即可。

@GlobalTransactional
	public Boolean create(Integer count){
		String url = "http://localhost:8086/deduct?productId=10001&count="+count;

		Boolean result = restTemplate.getForObject(url, Boolean.class);
		if(result!=null && result){
			if(5 == count){
				throw new RuntimeException("order 发生异常");
			}
			log.info("数据库开始创建订单");
			return true;
		}
		return false;
	}

补充

Seata Server端信息配置db模式

1. 打开`conf/file.conf`文件
2. 修改mode = 'db'
3. 修改数据库连接信息
4. 新建数据库seata及表结构:可以去seata提供的资源信息中下载https://github.com/seata/seata/tree/1.3.0,其sql位置在/script/server/db/mysql.sql;

image-20230824110444935

配置Nacos注册中心,负责与TC通信

将Seata Server注册到nacos,修改config目录下的registry.conf配置

registry {
  type = "nacos"
  nacos {
    application = "seata-server"
    serverAddr = "127.0.0.1:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = "nacos"
    password = "nacos"
  }
}

配置Nacos作为配置中心

  1. Seata-Server端配置nacos配置中心,在registry.conf中加入配置使用nacos作为配置中心
config {
  type = "nacos"

  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
  }
}

其中的含义为:

  • Registry:服务器要注册到nacos的位置(命名空间,集群地址)
  • Config:Seata服务器配置,这里需要去nacos配置中心上去获取配置,所以需要推上去。

在nacos 主目录,创建config.txt,内容拷贝git上的配置https://github.com/seata/seata/blob/1.3.0/script/config-center/config.txt

主要修改的内容如下

# 其中my_test_tx_group是可以自定义的且之后要与seata客户端中相匹配
service.vgroupMapping.my_test_tx_group=default

 
# 修改为db,下面修改到对应数据库的信息
store.mode=file

store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true
store.db.user=username
store.db.password=password

同在nacos主目录,创建nacos-config.sh,内容拷贝git上的配置https://github.com/seata/seata/blob/1.3.0/script/config-center/nacos/nacos-config.sh

主要修改的内容如下

# 需要修改nacos-config.sh文件第97行代码,用以获取config.txt文件

image-20230825103513920

修改nacos-config的权限

chmod 777 ./nacos-config.sh

整个目录解构如下

image-20230825103702226

运行nacos-config.sh

./nacos-config.sh -h 127.0.0.1 -p 8848 -u nacos -w nacos -g SEATA_GROUP
参数说明
-h  host 默认值 localhsot
-p  post 默认值 8848
-u  nacos用户名
-w  nacos密码
-g  配置分组 默认值为 ‘SEATA_GROUP’
-t  租户信息 对应Nacos的命名空间id字段,默认为空

image-20230825104138280

随后登录nacos-server查看配置信息

image-20230825104236162

标签:事务,Seata,解决方案,db,nacos,分布式,config,seata
From: https://www.cnblogs.com/shine-rainbow/p/17656323.html

相关文章

  • 分布式
    一、理论1、CAPC:一致性:所有节点访问同一份最新的数据副本A:可用性:非故障的节点在合理的时间内返回合理的响应,不是错误或者超时的响应P:分区容错性:分布式系统在出现网络分区的时候,依然能够对外提供服务网络分区:分布式系统中,多个节点之间的网络原本是联通的,但是由于某些故障......
  • Ubuntu22.04(禁用)彻底删除Snap以及出现“rm: 无法删除"XXX":只读文件系统”的解决方案
    Ubuntu22.04(禁用)彻底删除Snap以及出现”rm:无法删除"XXX":只读文件系统“的解决方案导语Snaps是Ubuntu的母公司Canonical于2016年4月发布Ubuntu16.04LTS(LongTermSupport,长期支持版)时引入的一种容器化的软件包格式。自Ubuntu16.04LTS起,Ubuntu操作系......
  • 华为高性能计算(HPC)文档——技术支持>智能计算解决方案>高性能计算>HPC
       链接地址:https://support.huawei.com/enterprise/zh/server-solutions/hpc-pid-253585671     ==============================================   PS:因为平时需要使用华为的HPC平台进行计算任务,有的时候需要查询帮助文档,这里标记下链接地址。 ......
  • 分布式数据库
    1.基于Redis分布式锁1.获取锁时,使用setnx加锁(setnxkeyval当且仅当key不存在时,set一个key为val的字符串,返回1;存在返回0;)锁的value为随机的UUID,释放锁的时候进行判断,使用expire命令添加一个超时时间,超过该时间自动释放锁2.释放锁时,通过UUID判断是不是该锁,是则delete进行锁释放......
  • 架构:第五章:分布式架构的演进
    单一应用架构 适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。缺点:1、性能扩展比较难2、协同开发问题3、不利于升级维护垂直应用架构 通过切分业务来实现各个模块独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能扩展也更方便,更有......
  • element-plus的el-select在切换时报ResizeObserver loop completed with undelivered
    报错场景:el-select放在了table的td里,我做的是根据el-select切换的动态表格。切换时就会报此错误。原因分析:分析发现,本场景在切换select时,其所在单元格尺寸发生了变化(因为我没有定表格内单元格的尺寸)。解决方案:保证el-select所在单元格尺寸不发生变化即可。......
  • 视频云存储/安防监控AI视频智能分析平台——智慧煤矿解决方案
    一、方案背景煤矿业是一个高风险行业,存在着许多潜在的安全隐患和风险。互联网、物联网、人工智能等新兴技术高速发展,为传统行业带来颠覆性变革,将高新技术与传统技术装备、管理相融合,实现产业转型升级已经成为煤矿行业发展趋势。二、行业痛点1)煤矿作业环境复杂,存在瓦斯爆炸、......
  • Kurator,你的分布式云原生解决方案
    本文分享自华为云社区《DTSETechTalk|第40期:Kurator,你的分布式云原生解决方案》,作者:华为云社区精选。什么是分布式云原生?中国信通院给出的定义:分布式云原生是指通过云原生技术统一多云技术栈,提供业务价值的设计模式。根据这个定义,我们延伸出以下几个问题:•什么是云原生技......
  • OpenHarmony 分布式硬件关键技术
     本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第8期 | OpenHarmony 分布式硬件关键技术》  演讲嘉宾 | 李   刚回顾整理 | 廖   涛排版校对 | 李萍萍嘉宾简介李刚,华为OpenHarmony技术专家,OpenHarmony分布式硬件技术负责人。主要负责OpenH......
  • 计讯物联水利行业应用终端在智慧农村水资源监测解决方案
    目前,农村城镇化进程加快,人口持续增加,加之有限的资源大量向城镇或工业等非农产业转移,进而导致农村水资源更为短缺,更别提实现农村水资源的多级高效利用。随着《关于全面推进乡村振兴加快农业农村现代化的意见》、《“十四五”规划》等政策的出台,政府陆续作出一系列重点部署,充分发挥......