用分布式事务中间件来保障金融级交易系统的一致性

背景介绍

本篇是北京云栖大会Tech Insight Workshop金融云主题《使用SOFA来快速构建金融级分布式交易系统》中的一个组成部分.

通过前面的篇章,我们已经借助SOFA Boot框架构建了基于微服务架构的分布式交易系统框架,以及借助数据访问代理将系统的订单库由单库单表模式改造为分库分表,便于支撑平台日益增长的数据量。

在本章节中会介绍如何通过引入蚂蚁中间件的分布式事务产品来保证金融级交易系统的一致性问题,并且会分别介绍分布式事务的两种模式:TCC模式和自动模式的使用方式。

DEMO整体架构与说明

实验涉及SOFA产品

环境准备

  • 通过之前步骤的操作,目前分布式交易系统DEMO已经具备了交易与支付两个微服务
  • 在这里我们依然需要基于SOFA Boot框架构建一个Core工程(facade范式):【账务】服务,该服务将用于处理消费者和商家之前的转账操作。(具体实现代码会在审核后放出)
  • 基于事务的视角,【支付】服务发起转账(事务)请求,【账户】服务处理实际的转账(事务)操作,那么【支付】服务在这里被视为事务的发起者,而【账户】服务被视为事务的参与者。
  • 分布式事务被简称问DTX(Distribution Transaction)

详细步骤

基于TCC模式的代码改造

  • 为【参与者】代码工程增加分布式事务的依赖包


  • 基于facade范式构建的工程,在service模块XML文件中配置分布式事务扫描器
  • 在facade中设计并参与者的从属业务(AccountTransMinus & AccountTransAdd)需要提供的TCC接口
  • 在service中实现参与者的从属业务接口
  • 实现了接口后就可以提供RPC服务进行发布了(生产者)
  • 将会基于共享版中间件进行发布,配置相关云上共享版的账户,截止当前步骤TCC模式下的参与者代码修改已经完成
  • 为【发起方】(【支付】服务)代码工程增加分布式事务的依赖包

  • 为【支付】服务引入【账务】服务的RPC调用的依赖,以及引入对应的bean


  • 模块XML文件中引入DTX扫描器
  • 改造【支付】服务,开启分布式事务,调用【账务】服务的两个从属业务接口
  • 至此,基于TCC模式下的分布式事务改造就完成了(当然,需要配置对应的账务数据库,先关的DDL语句与DAL代码请在DEMO源码开放出后进行参照)。

基于自动模式的代码改造

可以看到,基于TCC的分布式事务改造虽然并不复杂,但是毕竟需要对已有的业务实现进行改造。自动模式的诞生就是为了解决这个问题,它的出现很大程度上可以通过不修改已有的业务代码就可以实现事务一致性的保障。

  • 为【参与者】工程引入分布式事务的依赖包


  • 配置分布式事务的扫描器
  • 通过原始业务代码中增加注解,来表示这里的业务逻辑包含事务,需要保障一致性
  • 修改数据源配置
  • 因为自动模式需要在参与者所使用的数据源中记录事务信息,所以需要手动在对应的业务数据库中创建两张表
CREATE TABLE `dtx_row_lock` (
  `action_id` varchar(128) NOT NULL COMMENT '分支事务号',
  `tx_id` varchar(128) NOT NULL COMMENT '主事务号',
  `table_name` varchar(64) DEFAULT NULL COMMENT '表名称',
  `row_key` varchar(512) NOT NULL COMMENT '行唯一key',
  `instance_id` varchar(32) NOT NULL COMMENT '实例id',
  `context` varchar(2000) DEFAULT NULL COMMENT '分支上下文',
  `feature` varchar(2000) DEFAULT NULL COMMENT '扩展属性',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`row_key`,`instance_id`),
  KEY `idx_txid_action_id` (`action_id`,`tx_id`,`instance_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='行锁';
CREATE TABLE `dtx_branch_info` (
  `action_id` varchar(128) NOT NULL COMMENT '分支事务号',
  `tx_id` varchar(128) NOT NULL COMMENT '主事务号',
  `status` varchar(4) DEFAULT NULL COMMENT '事务状态',
  `log_info` blob COMMENT 'undo/redo log',
  `biz_type` varchar(32) DEFAULT NULL COMMENT '发起方业务类型',
  `instance_id` varchar(32) DEFAULT NULL COMMENT '实例id',
  `context` varchar(2000) DEFAULT NULL COMMENT '分支上下文',
  `feature` varchar(2000) DEFAULT NULL COMMENT '扩展属性',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`action_id`),
  KEY `idx_txid_action_id` (`action_id`,`tx_id`,`instance_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分支记录日志';
  • 至此,自动模式下参与者的修改就完成了
  • 进行对发起方的修改,首先是添加依赖包



  • 增加分布式事务的扫描器
  • 增加注释,以表明这里包含事务
  • 修改数据源
  • 至此,基于自动模式的【发起方】的代码改造也已完成。相关的DEMO源码需要在审核后对外进行发布。

结论

至此,基于SOFA这个可扩展的分布式云平台所构建的金融交易系统就创建完毕了,整个DEMO分别涉及到分布式数据库,微服务框架,分布式事务等构建金融相关应用所需的基本服务框架,整体的构建过程也比较清晰明了,便于用户的快速入手。在最后环节的分布式事务演示中可以看到,基于自动模式的分布式事务对业务的改造量非常的小,基本可以说是没有侵入性,非常适合需要低成本快速接入分布式事务来保证业务的一致性,同时对TPS以及并发要求不高的业务场景使用。

时间: 2024-07-31 18:44:05

用分布式事务中间件来保障金融级交易系统的一致性的相关文章

阿里中间件(Aliware)双十一专题——“分布式事务中间件GTS(TXC)”

一. 前言 什么是事务?大家最熟悉的莫过于数据库事务,一大堆SQL操作一个DB,要么同时成功.要么同时失败.(GTS支持ACID,特此公告,不再解释) 什么是分布式事务?一大堆SQL操作N个DB,或者一大堆服务操作1个或多个DB,要么同时成功.要么同时失败. 怎么保证事务?有一个解决办法是"两阶段提交",一阶段大家先把该做的做了但是不提交,二阶段再一起提交或都不提交. 单机事务到分布式事务的变化?在分布式环境下,所有的状态同步都需要走网络,成本变得非常高.因此做好分布式事务容易,难点在

破解世界性技术难题! GTS让分布式事务简单高效

近日,2017云栖大会·深圳峰会如期举行,多项阿里云新产品对外发布.在企业级互联网架构分会场,来自阿里中间件(Aliware)的技术专家及合作伙伴,为现场参会嘉宾带来最新的传统IT架构到企业级互联网架构跨越式升级.实现互联网转型的产品及解决方案.其中高级技术专家姜宇在分享中带来的Aliware新产品-全局事务服务(Global Transaction Service ,简称GTS),在分布式事务处理上带来的高性能和技术创新令到场参会的各路技术专家眼前一亮. Aliware新成员-全局事务服务GT

GTS for DRDS分布式事务的实现理解

GTS介绍 全局事务服务(Global Transaction Service,简称 GTS)是一款高性能.高可靠.接入简单的分布式事务中间件,用于解决分布式环境下的数据一致性问题. 一个完整的业务往往需要调用多个子业务或服务,随着业务的不断增多,涉及的服务及数据也越来越多,越来越复杂.传统的系统难以支撑,出现了应用和数据库等的分布式系统.分布式系统又带来了数据一致性的问题,从而产生了分布式事务. 分布式事务是指事务发起者.资源管理器.事务协调者及资源分别位于不同的分布式系统的不同节点之上. G

关于分布式事务

一.普通事务与分布式事务 1.1 普通事务 普通事务就是一般所说的数据库事务,大家对数据库事务应该都很了解,这里再简单介绍下. 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成.当事务被提交给了DBMS(数据库管理系统),则DBMS(数据库管理系统)需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的

分布式事务云市场分析

背景 全局事务服务GTS上个月开始在阿里云上公测,之前我们也发表了一篇「破解世界性技术难题!GTS让分布式事务简单高效」的文章,引起了业界广泛关注,接受了大量的咨询,故希望通过本文让大家对GTS有更深入的理解. GTS在目前在阿里内外部已经有较大规模的应用,有100多个用户,其中专有云大用户就有10多个,预计今年将有更大规模的市场需求爆发. 用户诉求是什么 分布式事务解决的用户最本质诉求是什么?数据一致. 大中企业有一个共同的诉求是数据一致,几乎覆盖到各个行业. 比如说零售行业,库存与出货的数据

alwaysOn为什么不支持分布式事务

Alwayson是微软从SQL2012开始引入的一种高可用和高性能架构,它既可以实现故障转移,同时又能实现查询分离,是当前SQL server的所有架构中最优秀的一种. 因此,一般我们都会推荐使用AlwaysON来部署生产数据库,不过,尽管AlwaysON的优势非常明显,但并非适应于所有的业务场景. AlwaysON不支持分布式事务和跨数据库事务 什么是分布式事务和跨数据库事务 分布式事务是指通过分布式事务协调器(MSDTC)的统一控制.将事务中的每个操作分解到多台主机上分别执行.每台主机执行成

蚂蚁金服CTO程立:金融级分布式交易的技术路径

蚂蚁金服首席技术官 程立 移动互联网.大数据与云计算作为新的基础设施,催生了新的互联网经济,正在推动各行各业的升级.伴随蚂蚁金服在新金融领域的探索,蚂蚁金服技术团队也在金融技术与架构领域不断开拓.从2005 年每秒处理1笔交易到2016 年"双十一"每秒处理12 万笔交易,从单一的支付到覆盖微贷.理财.保险.信用.银行等,通过十多年的探索与实践,我们形成一套包含金融级分布式交易.分布式大数据分析与决策等在内的完整架构与技术体系. 金融级系统的关键目标 如果将建造系统比作盖楼的话,建一个

分布式事务:不过是在一致性、吞吐量和复杂度之间,做一个选择

微服务架构流行的今天,一次交易需要跨越多个"服务".多个数据库来实现,传统的技术手段,已经无法应对和满足微服务情况下这些复杂的场景了.针对微服务下的交易业务如何保障数据一致性,本文尽量做到理论结合实际,将我们在实际产品中用到的分布式事务实现机制,和大家扒一扒,希望能帮助到读者. 谈到分布式事务,必须先把"CAP"拿出来说说事......,当然还有"BASE"...... 从架构的角度来看,业务拆分(数据分区).数据一致性.性能(可用性)永远是个平

UCloud高可用UDB 开启金融级云端数据库服务

  数据库作为底层的数据存储和管理工具,是企业IT系统中不可或缺的一环.从Oracle.DB2到目前最流行的开源数据库MySQL,关系型数据库已经存在了近40年,在企业中所发挥的作用不可替代. 但与此同时"不重视数据安全的情况在企业中比较突出",千人计划专家王子骏表示.尤其对于高成长性企业,普遍采用开源MySQL数据库,但其对某些功能(例如引用.事务.审计等)的实现方式使得它与其他关系型数据库相比缺少了一些可靠性.在数据库容量增长很快时,系统宕机.数据丢失总是在意想不到的时间.地点.场