文档章节

Saga分布式事务框架

战略板儿砖
 战略板儿砖
发布于 07/13 18:02
字数 1701
阅读 95
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

1优点

1、避免服务之间的循环依赖,因为saga协调器会调用saga参与者,但参与者不会调用协调器

2、集中分布式事务编排

3、降低参与者的复杂性

4、回滚更容易管理

Saga模式的一大优势是它支持长事务。因为每个微服务仅关注其自己的本地原子事务,所以如果微服务运行很长时间,则不会阻止其他微服务。这也允许事务继续等待用户输入。此外,由于所有本地事务都是并行发生的,因此任何对象都没有锁定。

缺点

协调器集中太多逻辑的风险

Saga模式很难调试,特别是涉及许多微服务时。此外,如果系统变得复杂,事件消息可能变得难以维护。Saga模式的另一个缺点是它没有读取隔离。例如,客户可以看到正在创建的订单,但在下一秒,订单将因补偿交易而被删除

场景:微服务

2微服务项目中如何使用ServiceComb Pack

条件

1、微服务项目

2、ServiceComb Pack saga事务框架alpha,协调器

3、servicecomb-pack-csharp-omega_v0.1,saga事务框架客户端omega,客户端

4、mysql或者PostgreSQL

2.1步骤

1、微服务项目操作

1.1 启动微服务项目,正确响应出结果

2、alpha操作

2.1 环境准备

jdk1.8 下载地址http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

PostgreSQL下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

Mysql下载地址:https://dev.mysql.com/downloads/mysql/

ServiceComb Pack 下载地址:http://servicecomb.apache.org/release/pack-downloads/

Mysql和PostgreSQL二者选一,默认是PostgreSQL

2.2 ServiceComb Pack 启动 (连接mysql为例)

2.2.1 PostgreSQL下启动ServiceComb Pack

切换到什么目录 D:\公开课专题\微服务专题\微服务4\分布式事务\alpha\apache-servicecomb-pack-distribution-0.5.0-bin 使用cmd

java -D"spring.profiles.active=prd" -D"spring.datasource.url=jdbc:postgresql://localhost:5432/saga?useSSL=false" -D"spring.datasource.username=root" -D"spring.datasource.password=root" -jar alpha-server-0.5.0-exec.jar

2.2.2 mysql配置

1、在apache-servicecomb-pack-distribution-0.5.0-bin目录下创建插件目录

plugins文件夹

2、 在plugins文件夹内部添加mysql驱动

mysql-connector-java-8.0.15.jar

3、mysql下启动ServiceComb Pack

切换到什么目录 D:\公开课专题\微服务专题\微服务4\分布式事务\alpha\apache-servicecomb-pack-distribution-0.5.0-bin 使用cmd

java -D"spring.profiles.active=mysql" -D"loader.path=./plugins" -D"spring.datasource.url=jdbc:mysql://localhost:3306/saga?useSSL=false&serverTimezone=Asia/Shanghai" -D"spring.datasource.username=root" -D"spring.datasource.password=root" -jar alpha-server-0.5.0-exec.jar

4、查询mysql saga数据库

事务相关表信息

txexvent- 事件表详情

txtimeout-超时表详情

compenste-补偿表详情

3、omega操作

3.1 环境准备

servicecomb-pack-csharp-omega_v0.1 下载地址:https://github.com/OpenSagas-csharp/servicecomb-pack-csharp#servicecomb-pack-csharp

3.2 omega配置

1、在RuanMou.MicroService下面创建解决方案文件夹

omega文件夹

2、在omega文件下面从导入项目

3、在AggregateService,MemberService,TeamService下分别引入

4、在AggregateService,MemberService,TeamService中从Servicecomb.Saga.Omega.Core中复制AssemblyInfo.cs 到根目录下

AssemblyInfo.cs

5、在AggregateService,MemberService,TeamService项目startup.cs引入

      public void ConfigureServices(IServiceCollection services)
        {
            // 7、注册saga分布式事务
            services.AddOmegaCore(option =>
            {
                option.GrpcServerAddress = "localhost:8080"; // 1、协调中心地址
                option.InstanceId = "AggregateService-1";// 2、服务实例Id
                option.ServiceName = "AggregateService";// 3、服务名称
            });
            services.AddControllers();
        }

6、在AggregateService项目AggregateController.cs文件中添加SagaStart

        /// <summary>
        /// 添加团队和成员信息
        /// </summary>
        /// <param name="value"></param>
        [HttpPost, SagaStart]
        public ActionResult Post(string value)
        {
            Console.WriteLine($"添加团队信息和成员信息");
            // 1、添加团队
            var team = new Team() { Name = "研发"};
            teamServiceClient.InsertTeams(team);
        // 2、添加团队成员
        var member = new Member() { FirstName ="tony",NickName="tony-1", TeamId = team.Id};
        memberServiceClient.InsertMembers(member);

        return Ok("添加成功");
    }   

7、在MemberService项目中MemberServiceImpl.cs文件下添加

  /// <summary>
        /// saga事务参与者 Compensable撤销业务 逻辑
        /// </summary>
        /// <param name="member"></param>
        [Compensable(nameof(DeleteMember))]
        public void Create(Member member)
        {
            memberRepository.Create(member);
        }

        void DeleteMember(Member member)
        {
            memberRepository.Delete(member);
        }

8、在TeamService项目中TeamServiceImpl.cs文件下添加

 /// <summary>
 /// saga事务参与者 Compensable撤销业务 逻辑
 /// </summary>
 /// <param name="team"></param>
 [Compensable(nameof(DeleteTeam))]
 public void Create(Team team)
 {
    teamRepository.Create(team);
 }
   /// <summary>
    /// 撤销方法
    /// </summary>
    /// <param name="team"></param>
    void DeleteTeam(Team team)
    {
        teamRepository.Delete(team);
    }   

正常情况

全部执行成功的情况下面

节点服务异常情况

1、TeamService服务异常

1.1 代码配置

 /// <summary>
        /// saga团队提交和撤销
        /// </summary>
        /// <param name="team"></param>
        [Compensable(nameof(DeleteCompensable))]
        public void Create(Team team)
        {
            teamRepository.Create(team);
// 1、异常情况测试
        throw new Exception("TeamService出现异常");
    }

    /// <summary>
    /// 撤销方法
    /// </summary>
    /// <param name="team"></param>
    void DeleteCompensable(Team team)
    {
        teamRepository.Delete(team);
    }   

·1.2 效果展示

 

2、MemberServce服务异常

2.1 在 MemberServce服务MemberServceImpl.cs中添加

       /// <summary>
        /// saga事务参与者 Compensable撤销业务逻辑
        /// </summary>
        /// <param name="member"></param>
        [Compensable(nameof(DeleteMember))]
        public void Create(Member member)
        {
            memberRepository.Create(member);
       // 1、异常情况测试
        throw new Exception("MemberService出现异常");
    }

    void DeleteMember(Member member)
    {
        memberRepository.Delete(member);
    }   

2.2 效果展示

 

3、AggregateService服务异常

3.1 代码配置

        /// <summary>
        /// 添加团队和成员信息
        /// </summary>
        /// <param name="value"></param>
        [HttpPost, SagaStart]
        public ActionResult Post(string value)
        {
            Console.WriteLine($"添加团队信息和成员信息");
            // 1、添加团队
            var team = new Team() { Name = "研发"};
            teamServiceClient.InsertTeams(team);
        // 2、添加团队成员
        var member = new Member() { FirstName ="tony",NickName="tony-1", TeamId = team.Id};
        memberServiceClient.InsertMembers(member);

        // 3、添加异常
        throw new Exception("AggregateService服务异常");
        return Ok("添加成功");
    }           

3.2 效果展示

节点超时情况

1、AggregateService超时

1.1 代码配置

        /// <summary>
        /// 添加团队和成员信息
        /// </summary>
        /// <param name="value"></param>
        [HttpPost, SagaStart(TimeOut =5)]
        public ActionResult Post(string value)
        {
            Console.WriteLine($"添加团队信息和成员信息");
            // 1、添加团队
            var team = new Team() { Name = "研发"};
            teamServiceClient.InsertTeams(team);
        // 2、添加团队成员
        var member = new Member() { FirstName ="tony",NickName="tony-1", TeamId = team.Id};
        memberServiceClient.InsertMembers(member);

        // 3、节点超时
        Thread.Sleep(10);
        return Ok("添加成功");
    }

1.2 结果展示​

 

ServiceComb Pack集群

步骤

1、ServiceComb Pack 实例1

切换到什么目录 D:\公开课专题\微服务专题\微服务4\分布式事务\alpha\apache-servicecomb-pack-distribution-0.5.0-bin 使用cmd

java -D"spring.profiles.active=mysql" -D"loader.path=./plugins" -D"spring.datasource.url=jdbc:mysql://localhost:3306/saga?useSSL=false&serverTimezone=Asia/Shanghai" -D"spring.datasource.username=root" -D"spring.datasource.password=root" -D"alpha.server.port=8080" -D"server.port=8090"  -jar alpha-server-0.5.0-exec.jar

2、ServiceComb Pack 实例2

切换到什么目录 D:\公开课专题\微服务专题\微服务4\分布式事务\alpha\apache-servicecomb-pack-distribution-0.5.0-bin 使用cmd

java -D"spring.profiles.active=mysql" -D"loader.path=./plugins" -D"spring.datasource.url=jdbc:mysql://localhost:3306/saga?useSSL=false&serverTimezone=Asia/Shanghai" -D"spring.datasource.username=root" -D"spring.datasource.password=root" -D"alpha.server.port=8080" -D"server.port=8090"  -jar alpha-server-0.5.0-exec.jar

3、ServiceComb Pack 实例2

切换到什么目录 D:\公开课专题\微服务专题\微服务4\分布式事务\alpha\apache-servicecomb-pack-distribution-0.5.0-bin 使用cmd

java -D"spring.profiles.active=mysql" -D"loader.path=./plugins" -D"spring.datasource.url=jdbc:mysql://localhost:3306/saga?useSSL=false&serverTimezone=Asia/Shanghai" -D"spring.datasource.username=root" -D"spring.datasource.password=root" -D"alpha.server.port=8080" -D"server.port=8090"  -jar alpha-server-0.5.0-exec.jar

4、分别连接到不同的集群进行操作数据库

ServiceComb Pack 注册到consul

条件

1、consul

步骤

1、配置consul

java -D"spring.profiles.active=mysql" -D"loader.path=./plugins" -D"spring.datasource.url=jdbc:mysql://localhost:3306/saga?useSSL=false&serverTimezone=Asia/Shanghai" -D"spring.datasource.username=root" -D"spring.datasource.password=root" -D"spring.cloud.consul.host=http://127.0.0.1" -D"spring.cloud.consul.port=8500" -D"spring.cloud.consul.enabled=true" -jar alpha-server-0.5.0-exec.jar

2、consul客户端查看

战略板儿砖
粉丝 1
博文 61
码字总数 33742
作品 0
烟台
程序员
私信 提问
加载中
请先登录后再评论。
TDD的测试框架--Machine.Specification

Machine.Specification 是一个 TDD 测试驱动开发的测试框架,简化了测试,无需关心语言本身特性。 Machine.Specifications 带来的好处是不需要在代码里有注释,但同时阅读代码的人可以一目了...

匿名
2013/01/22
1K
0
mvc框架--Razor

Razor 是一个轻巧而优雅的servlet mvc框架 # 又一个轮子? no,写就她是为了证实我个人的某些想法,并在这个过程中练练手,这两种冲动碰撞在一起,自然而然地产生了Razor # Razor的现在和未来...

dtubest
2013/01/25
2.9K
0
Android3D应用与游戏开发框架--JQGL

JQGL 是一款针对Android设备上3D应用、游戏的开发框架。 核心功能是OpenGL-ES的使用框架,相对于大部分开发者而已,OpenGL是陌生的,没有专门研究无法进行相关的开发。 本框架针对于Android...

Jping
2013/02/21
1.5K
0
工作流管理系统--Pegasus WMS

Pegasus (飞马座)工作流管理系统包括一套技术标准工作流程应用程序中执行帮助许多不同的环境中,包括桌面、校园集群、网格、云。它弥补了科学领域和执行环境通过自 动映射到分布式资源的高层工...

匿名
2013/02/24
5.2K
0
响应式框架--Groundwork

GroundworkCSS 是一个基于 Sass 预处理器的开源项目 ,主要用于快速构建响应式 Web 应用程序。拥有一个灵活的、可嵌套的网格系统,可以创建适应多种浏览设备的布局。 Groundwork 还提供多种 ...

匿名
2013/02/25
2.8W
4

没有更多内容

加载失败,请刷新页面

加载更多

如何在Android中以像素为单位获取屏幕尺寸 - How to get screen dimensions as pixels in Android

问题: I created some custom elements, and I want to programmatically place them to the upper right corner ( n pixels from the top edge and m pixels from the right edge). 我创建......

javail
43分钟前
7
0
如何在不安装Microsoft Office的情况下用C#创建Excel(.XLS和.XLSX)文件?

问题: 如何在不使用运行代码的计算机上安装Excel的情况下使用C#创建Excel电子表格? 解决方案: 参考一: https://stackoom.com/question/dHZ/如何在不安装Microsoft-Office的情况下用C-创...

技术盛宴
今天
7
0
如何使用pip升级所有Python软件包? - How to upgrade all Python packages with pip?

问题: Is it possible to upgrade all Python packages at one time with pip ? 是否可以通过pip一次升级所有Python软件包? Note : that there is a feature request for this on the off......

法国红酒甜
今天
9
0
活体检测+合成图鉴别面前,人脸“照片活化”黑产攻击一秒被擒

本文作者:y****n 如今,随着人脸技术的日趋成熟,新兴娱乐文化得到了极大的推动,尤其是随着 DeepFake、FaceSwap 等人脸编辑及生成技术的发展,虚拟主播、人脸合成带给人们全新的体验,但同...

百度开发者中心
昨天
12
0
如何在SQL Server中将多行文本合并为单个文本字符串?

问题: Consider a database table holding names, with three rows: 考虑一个包含名称的数据库表,该表具有三行: PeterPaulMary Is there an easy way to turn this into a single str......

富含淀粉
今天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部