微信号:infoqchina

介绍:有内容的技术社区媒体

支付宝分布式事务测试方案

2014-05-26 17:51 InfoQ

什么是分布式事务

传统的基于数据库本地事务的解决方案只能保障单个服务的一次处理具备原子性、隔离性、一致性与持久性,但无法保障多个分布服务间处理的一致性。因此,我们必须建立一套分布式服务处理之间的协调机制,保障分布式服务处理的原子性、隔离性、一致性与持久性。


支付宝为什么需要分布式事务

基于SOA架构,整个支付宝系统会拆分成一系列独立开发、自包含、自主运行的业务服务,并将这些服务通过各种机制灵活地组装成最终用户所需要的产品与解决方案。


在多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件、账户余额不足等)、系统故障(如网络或系统超时或中断、数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处于不一致的状态,产生严重的业务后果,所以我们需要一个分布式事务的解决方案,用来协调多个服务的业务一致性。


支付宝的分布式事务框架

支付宝开发的分布式事务是基于两阶段提交的理论(Two Phase Commit),首先给出两阶段提交的逻辑图:


为了能够有效的让框架进行分布式事务的提交、回滚等动作,框架需要在整个两阶段执行过程中记录下足够的信息,设计了两张表来记录相关信息:

  • 分布式业务控制活动主表:记录了全局事务的活动状态;

  • 原子业务活动表:记录了原子业务活动的状态;


我们用一个例子来说明,看一个典型的分布式事务场景。业务场景描述: 用户购买商品,使用支付宝余额支付:

测试方案


分析步骤

  • 角色定位

  • 各分支的业务活动记录状态

  • 梳理业务各个场景

  • 验证梳理场景

  • 恢复&回查机制


角色定位

首先测试人员需要分析所测试的系统处于分布式事务中的哪一个环节中,是处于事务的发起者,还是事务的参与者,不同的角色的定位对于测试分析角度不同,主要有以下的区别:

  • 发起者分为同库/异库模式,主要区分是控制全局事务状态的主事务记录是否持久化在自己系统的db中;

  • 参与者:分为本地/远程模式,主要区分是是否可以创建嵌套的分布式事务。


各分支的业务活动记录状态

主事务记录:

根据业务场景的不同,主事务记录状态也会相应改变,主要的状态机变化如图所示,测试人员需要模拟业务场景来验证状态机的迁转是否正确;


同库:初始状态:I;提交成功:C;提交失败:I

异库:初始状态:U;提交成功:U;提交失败:U


梳理&验证业务场景

  • 分析维度

  • 一阶段:预处理:成功/失败;

  • 二阶段:提交/回滚;

  • 预期结果

  • 各个状态场景


恢复&回查

恢复:应用使用分布式事务,出现处理失败的业务活动,为了确保产生的影响不破坏业务一致性,我们必须对这些记录进行恢复处理;

回查:对于异库模式,事务状态为U,若提交或回滚失败,分布式事务总控系统无法感知这笔分布式事务是否执行成功,需要业务系统提供相应的回查接口。


恢复及回查接口需要特别关注,对于分布式事务的正常二阶段提交或回滚,业务场景覆盖时多半都能check到,但是对于恢复及回查逻辑,很多时候都会遗漏,所以测试人员需要对这块特别做一个分析。


***********************************

本文来自InfoQ微信公众账号:infoqchina

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。

***********************************


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 重磅!大数据正式提升为国家战略,下一个万亿风口正席卷而来! 程序员是如何成功的 推荐!国外程序员整理的 PHP 资源大全 HRoot:透析全球第二大人力资源服务市场——日本 基于TLS1.3的微信安全通信协议mmtls介绍