支付宝分布式事务介绍_第1页
支付宝分布式事务介绍_第2页
支付宝分布式事务介绍_第3页
支付宝分布式事务介绍_第4页
支付宝分布式事务介绍_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2009年7月27日核心开发组红雪20:591What-分布事务快速浏览Why-为什么要引入分布事务How-如何实现分布事务Warning-注意点20:592大 纲20:593 事 务 复 习操作时间资源位置A112345ABCC2B3C4A5事务1事务2事务3事务:由一组操作构成的可靠、独立的工作单元ACID:Atomicity(原子性)Consistency(一致性)Isolation(隔离性)Durability(持久性)难点:高度并发资源分布大时间跨度20:594 本地事务本地事务事务由资源管理器(如DBMS)本地管理优点支持严格的ACID属性可靠高效状态可以只在资源管理器中维护应用编

2、程模型简单(在框架或平台的支持)局限不具备分布事务处理能力隔离的最小单位由资源管理器决定,如数据库中的一条记录应用/应用服务器/应用框架AP资源管理器RM开始会话开始事务操作1操作n提交/回滚事务完成会话锁日志 复 习20:595 全局事务(DTP模型) 复 习5资源管理器RM2应用/应用框架/应用服务器AP资源管理器RM13. 操作1.n6. 提交事务事务管理器TM1. 开始全局事务2. 注册资源14. 注册资源25. 操作1.n7. 准备8. 准备9. 提交10. 提交全局事务事务由全局事务管理器全局管理事务管理器管理全局事务状态与参与的资源,协同资源的一致提交/回滚TX协议应用或应用服务

3、器与事务管理器的接口XA协议全局事务管理器与资源管理器的接口20:596 两阶段提交(Two Phase Commit) 复 习准备操作与ACIDA: 准备后,仍可提交与回滚C: 准备时,一致性检查必须OKI: 准备后,事务结果仍然只在事务内可见D: 准备后,事务结果已经持久局限协议成本 (准备操作是一定必须的吗)准备阶段的持久成本全局事务状态的持久成本潜在故障点多带来的脆弱性准备后,提交前的故障引发一系列隔离与恢复难题事务管理器TM资源管理器RM11. 准备OK3. 提交OK资源管理器RM22. 准备OK4. 提交OK事务管理器TM资源管理器RM11. 准备OK3. 回滚OK资源管理器RM2

4、2. 准备NO4. 回滚OK620:597 网关未独立前:一条龙 回 顾7账务处理逻辑iwallet交易处理逻辑主库网银处理逻辑持久操作1持久操作2持久操作4提交/回滚本地事务持久操作320:598 网关独立部署 回 顾账务处理逻辑iwallet交易处理逻辑主库网银处理逻辑持久操作1持久操作2持久操作3bankgw账务处理逻辑通知持久操作4提交/回滚本地事务提交/回滚本地事务20:599 交易服务化进程 回 顾账务处理逻辑trade交易处理逻辑主库网银处理逻辑持久操作1持久操作2持久操作4bankgw通知持久操作4提交/回滚本地事务提交/回滚本地事务账务处理逻辑iwallet持久操作3提交/回

5、滚本地事务20:5910 账务服务化 回 顾 主库持久操作4bankgw 账务库tradeacctrans持久操作1持久操作2持久操作3确保通知提交/回滚分布事务提交/回滚分布事务20:5911 双峰插云 回 顾 主库持久操作1mipgw 账务库paycoreacctrans持久操作3持久操作2提交/回滚嵌套分布事务 支付库20:5912 基本原则 集 成适用场景业务活动中包括账务参与者的n只要操作账务,必须使用分布式事务,支付宝系统特有n账务是作为默认参与者存在的多个业务活动参与者之间必须保持语义状态一致性的n可选,对于非实时类业务,可使用高可靠的ESB消息完成一致性遵守必须在本地事务块中开

6、启分布式事务;必须使用全局唯一的主事务号20:5913 工作原理及步骤 集 成n业务系统开启本地事务块;n启动一个业务活动;事务同步器持久化此业务活动记录至DB,并将主事务号存放至本地线程变量中;n业务系统开始调用账务服务:账务的服务接口参数列表的txId主事务号是无需设置的,事务同步器会用本地线程变量内的主事务号替换之;n账务前置进行账务处理后同步响应处理结果;n业务系统分析账务处理结果,如正常则提交本地事务块;事务同步器调用账务交易结束器完成账务提交,如账务提交失败则后续等待分布式事务恢复查询继续尝试提交,直至账务提交完成为止;n若本地事务回滚,同步器则调用账务交易结束器完成账务回滚,如账

7、务回滚失败则后续等待分布式事务恢复程序继续尝试回滚,直至账务回滚成功为止。20:5914 示例代码 集 成 public AccountTransResult foo() return (AccountTransResult)transactionTemplate .execute(new TransactionCallback() /确保在本地事务块中 public Object doInTransaction(TransactionStatus status) AccountTransResult transResult =null; try businessActivityControl

8、Service.start(.); /启动业务活动 transResult = accountTransFacade.freezeAccountBalance(null,.); /请求账务交易处理 /判断账务前置处理结果 if (transResult.isSuccess() localBizHandle(); /本地业务逻辑处理 localDBHandle(); /本地数据持久处理 else logger.error(.); 、 status.setRollbackOnly(); /显式回滚 catch (Exception e) logger.error(.); status.setRol

9、lbackOnly(); /显式回滚 return transResult; ); 20:5915本地事务模板 集 成transactionTemplate n使用主库dataSource:在本地事务提交/回滚发生时,主事务记录(处于主库)的提交/回滚状态可做到确保一致;当事务同步器无法顺利提交/回滚账务操作,则分布式任务恢复程序在进行恢复时无需回查业务当前状态n使用非主库dataSource:在本地事务提交/回滚发生时,主事务记录(处于主库)的提交/回滚状态无法做到确保一致;当事务同步器无法顺利提交/回滚账务操作,则分布式任务恢复程序在进行恢复时需要回查业务当前状态20:5916 回查实现示

10、例代码 集 成 /* (non-Javadoc) * see com.alipay.sofa.platform.xts.bacs.spi.BusinessActivityStateResolver#isDone(java.lang.String, java.lang.String) */ public int isDone(String businessType, String businessId) if (StringUtil.isBlank(businessType) | StringUtil.isBlank(businessId) logger.error(严重异常:参数不全;尝试解释

11、业务活动状态businessType= + businessType + ;businessId=+ businessId + 时。); return BusinessActivityStateResolver.UNKNOWN; return (Integer) transactionTemplate.execute(new TransactionCallback() public Object doInTransaction(TransactionStatus status) if (StringUtil.equals(WithdrawBusinessType.BALANCE, busine

12、ssType) try WithdrawInstructionDO data = withdrawInstructionDAO.lock(businessId); if (data = null) logger.error(严重异常:支付指令数据不存在;尝试解释业务活动状态businessType= + businessType+ ;businessId= + businessId + 时。); return BusinessActivityStateResolver.UNKNOWN; else if (StringUtil.equals(InstructionStatusEnum.PRE_A

13、CCREDITED.getCode(), data.getStatus() logger.warn(成功解释业务活动状态businessType= + businessType + ;businessId=+ businessId + :未执行。); return BusinessActivityStateResolver.NOT_DONE; else if (StringUtil.equals(InstructionStatusEnum.SUBMIT_SETTLED.getCode(), data.getStatus() logger.warn(成功解释业务活动状态businessType=

14、 + businessType + ;businessId=+ businessId + :已执行。); return BusinessActivityStateResolver.DONE; else logger.error(严重异常:支付指令数据状态不正常,当前状态: + data.getStatus() + ;尝试解释业务活动状态businessType= + businessType+ ; businessId= + businessId + 时。); return BusinessActivityStateResolver.UNKNOWN; catch (Exception e) l

15、ogger.warn(警告:数据库异常;尝试解释业务活动状态businessType= + businessType+ ;businessId= + businessId + 时。, e); return BusinessActivityStateResolver.UNKNOWN; else logger.error(严重异常:无需进行业务活动解释的类型;尝试解释业务活动状态businessType= + businessType+ ;businessId= + businessId + 时。); return BusinessActivityStateResolver.UNKNOWN; );

16、 20:5917 启动业务活动 集 成businessActivityControlService.start(.); 业务活动的启动有两种方式:l带参数: businessType + businessIdnbusinessType:业务活动类别,每个类别的前三位对应到某个业务类型,后三位是对此业务类型的具体操作;如002代表提现,而002001代表提现申请中的冻结部分nbusinessId:业务数据的ID或可以唯一定位到业务数据的keyl无参数:系统自动分配业务活动ID(全局唯一)推荐使用以businessType + businessId方式启动业务活动:l根据businessType

17、可准确定位至业务及操作,便利了对故障的分析、排查、以及出错系统的快速定位l利用businessType的前三位,分布式任务恢复程序可以找到正确的回查实现者l通过businessId,可以迅速的定位到具体的业务数据、日志信息等20:5918 分布任务恢复回查配置 集 成 、 20:5919 配 置 集 成 accountTransActionInterceptor20:5920 配 置 集 成com.alipay.acctrans.service.facade.AccountTransFacadehttp:/accountTransFacadeMulePort$acctrans_service_

18、url/services/accountTransFacade$acctrans_service_url/services/accountTransFacade?wsdl2000020:5921 配 置 集 成com.alipay.sofa.platform.xts.bacs.spi.AccountTransFinalizerhttp:/accountTransFinalizerMulePort$acctrans_service_url/services/accountTransFinalizer$acctrans_service_url/services/accountTransFinali

19、zer?wsdl2000020:5922 配 置 集 成businessActivityDAObusinessActionDAO20:5923 配 置 集 成mand.result.ResultCmon.enums.MessageEnumcom.alipay.acctrans.core.module.enums.FreezeBalanceTypeEnumcom.alipay.acctrans.core.module.enums.AccountMemoEnumcom.alipay.acctrans.core.module.enums.TransResultEnumcom.alipay.acctr

20、ans.core.module.enums.TransCodeEnumcom.alipay.acctrans.core.module.enums.SubTransCodeEnumcom.alipay.acctrans.core.module.enums.TerminalEnumcom.alipay.acctrans.core.module.enums.ChannelEnumcom.alipay.acctrans.core.module.enums.AccountTypeEnumcom.alipay.acctrans.core.module.enums.AccountEnableStatusEnumcom.alipay.acctrans.core.module.enums.FreezeModelEnumcom.alipay.acctrans.core.module.enums.B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论