Apache ServiceComb Saga 是一个微服务应用的数据最终一致性解决方案

中文官方地址:https://github.com/apache/servicecomb-saga/blob/master/README_ZH.md

特性

  • 高可用。支持集群模式。
  • 高可靠。所有的事务事件都持久存储在数据库中。
  • 高性能。事务事件是通过gRPC来上报的,且事务的请求信息是通过Kyro进行序列化和反序列化的。
  • 低侵入。仅需2-3个注解和编写对应的补偿方法即可进行分布式事务。
  • 部署简单。可通过Docker快速部署。
  • 支持前向恢复(重试)及后向恢复(补偿)。
  • 扩展简单。基于Pack架构很容实现多种协调机制。

架构

Saga Pack 架构是由 alpha 和 omega组成,其中:

  • alpha充当协调者的角色,主要负责对事务进行管理和协调。
  • omega是微服务中内嵌的一个agent,负责对网络请求进行拦截并向alpha上报事务事件。

alpha可以简单理解是事务处理的服务端,

omega是需要进行事务处理的客户端的SDK,在我的项目里,就是.net core应用程序的sdk,

幸运的是官方提供了C#语言版本Omega 可参见 https://github.com/OpenSagas-csharp/servicecomb-saga-csharp

数据库官方目前提供了两个:postpresql和mysql, 和alpha一样都可以通过docker快速部署,

部署服务端alpha-server

下面开始部署服务端alpha-server:

官方提供了用于快速部署的docker compose文件:

version: '2'

services:
postgres:
image: postgres
container_name: postgres
ports:
- "5432:5432"
environment:
POSTGRES_USE: saga
POSTGRES_USER: saga
POSTGRES_PASSWORD: password
networks:
- saga alpha-server:
image: djlnet/alpha-server:0.3.0-SNAPSHOT
container_name: alpha-server
ports:
- "8080:8080"
- "8090:8090"
environment:
JAVA_OPTS: -Dspring.profiles.active=prd -Dspring.datasource.url=jdbc:postgresql://postgres/saga?useSSL=false
networks:
- saga
depends_on:
- postgres networks: saga:
driver: bridge

也就是说我们的环境首先要安装docker 和 docker-compose

安装成功后,我们运行docker-compose up -d命令

通过docker ps 可以看到容器已经启动:

通过netstat -ntlp 可以看到端口已经开启:

接下来,我们可以Navicat 12 for PostgreSQL 查看数据库是否正常

下载安装地址:https://www.navicat.com/en/download/navicat-premium

安装成功后,创建连接,测试连接:

alpha-server运行成功的标志,目前还没有一个UI,只能通过端口号是否运行,来判断了。

服务端的工作就已经完成了。

部署客户端

下面是客户端:可以直接参考上面链接中的github项目,里面提供了三个测试项目:

主要的工作如下:

  1. 设置对alpha-server的连接,注册自己
  2. 在事务开始的方法的打上attribute:SagaStart
  3. 添加事务补偿方法

代码非常简单:

每个项目添加代码:

在action方法上添加特性:SagaStart:

事务补偿特性和补偿方法:

部署完成后,就可以测试了,接口跑通后,就可以查看数据库那三张表:

saga+.net core 分布式事务处理的更多相关文章

  1. .NET分布式事务处理

    在进行数据持久化的时候,我们会经常用到事务处理.一般情况下,ADO.NET中的事务处理就能够满足我们的需要,但是,ADO.NET中的事 务不能同事对多个数据库连接进行原子性的操作:如果在你的业务环境中 ...

  2. .NET分布式事务处理总结【下】 - 包含MSMQ的分布式事务处理

    转自:http://www.cnblogs.com/daxnet/archive/2011/03/15/1984995.html .NET直接提供对MSMQ的访问支持,只需要添加System.Mess ...

  3. 【JTA】JTA允许应用程序执行分布式事务处理

    JTA,即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据.JDBC驱动程序的JTA支持极大地增强了数据访问能力. htt ...

  4. ORA-02049: 超时: 分布式事务处理等待锁

    java.sql.SQLSyntaxErrorException: ORA-02049: 超时: 分布式事务处理等待锁 ORA-06512: 在 "HECDEV.BGT_JOURNAL_BA ...

  5. .NET分布式事务处理(转)

    出处:http://www.cnblogs.com/youring2/archive/2011/06/12/MSDTC.html 在进行数据持久化的时候,我们会经常用到事务处理.一般情况下,ADO.N ...

  6. ASP.NET Core分布式项目实战

    ASP.NET Core开发者成长路线图 asp.net core 官方文档 https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/ ...

  7. 【转】错误: ORA-01591: 锁被未决分布式事务处理 7.2.428982 持有--解决方案

    SQL 错误: ORA-01591: 锁被未决分布式事务处理 7.2.428982 持有 01591. 00000 -  "lock held by in-doubt distributed ...

  8. 【ITOO 4】WCF中,分布式事务处理

    导读:事务可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠.在项目中,就有 ...

  9. ASP.NET Core分布式项目-2.oauth密码模式identity server4实现

    源码下载 这里根据<ASP.NET Core分布式项目-1.IdentityServer4登录中心>的代码来继续更新oauth密码模式,这里的密码模式比上次的客户端模式更安全 在WebAp ...

随机推荐

  1. Mysql日常操作

    创建用户并授权 grant all privileges on test.* to "test"@"localhost" identified by " ...

  2. python web 程序的9种部署方式

    python有很多web 开发框架,代码写完了,部署上线是个大事,通常来说,web应用一般是三层结构 Web Server====>    Application=====>   DB S ...

  3. python学习笔记(七)操作mysql

    python操作mysql数据库需要先安装pymysql模块,在之前博客中可翻看如何安装,最简单的就是pip install pymysql 1.导入pymysql模块   import pymysq ...

  4. 模块讲解----time与date time(时间模块)

    time和datetime 在python中,通常有一下几种方式来表示时间:1.时间戳:2.格式化时间字符串:3.元祖(struct_time):其中元祖(struct_time分为九个元素) UTC ...

  5. C++实现不能继承的类

    实现一个不能继承的类,这在Java等语言中是很好实现的,被final关键字修饰的类不能被继承. C++中没有类似的关键字,须自己实现.一般有如下两种方法: 1.设置构造方法与析构方法为私有 class ...

  6. 数据库(11)-- Hash索引和BTree索引 的区别

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  7. spark restful 作业提交

    spark1.4起,在启动master进程时候,同时会有一个restful的服务器,可以接受RESTFUL的请求, 以下是提交应用的示例 curl -X POST http://tssloginsig ...

  8. 有关RDD的基础学习1

    1.spark rdd为什么不能嵌套?    譬如 val rdd1=sc.parallel(range(1,100))    val rdd2=sc.parallel(range(1,100))   ...

  9. cocos2d: fullPathForFilename: No file found at /cc_2x2_white_image. Possible missing file.

    程序运行的时候输出这条信息cocos2d: fullPathForFilename: No file found at /cc_2x2_white_image. Possible missing fi ...

  10. DataTables VS EasyUI DataGrid 基础应用 转

    DataTables中文网推出了 第一篇 关于DataTables和其他表格插件比较后,为了把让这个比较更有意义,更能帮助到大家,DataTables中文网 做了问卷调查,根据小伙伴们的填写我归纳了一 ...