链氪巴士
  1. 首页
  2. 站点导航
  3. 文章
  4. 快讯
  5. 软件
  6. 书刊
  7. 关于

EasyTransaction:一站式分布式事务解决方案

EasyTransaction是一个分布式事务解决方案,它统一了TCC、SAGA、FMT(seata/fescar AutoCompensation)、可靠消息、补偿等事务的使用。具有引入JAR包即用、包含多种事务形态、高性能、业务代码可无入侵、支持嵌套事务等特性。在使用上,业务...

访问官网 →

【Github】项目名:EasyTransaction:一站式分布式事务解决方案

一、项目简介

EasyTransaction是一个分布式事务解决方案。它统一了TCC、SAGA、FMT(seata/fescar AutoCompensation)、可靠消息、补偿等事务的使用。该框架旨在解决分布式SOA(包括微服务等)的事务问题,其是结合公司之前遇到的分布式事务场景以及支付宝程立分享的一个PPT而设计实现的。

二、特性

  1. 引入JAR包即用,无需独立部署协调者(使用extensionsuite – database – starter时无需独立部署ZooKeeper)。
  2. 一个框架包含多种事务形态,可混合使用。
  3. 高性能,若不启用框架的幂等功能,对业务数据库的额外消耗仅为写入25字节的一行。
  4. 可选的框架自带幂等实现及调用错乱次序处理。
  5. 业务代码可实现完全无入侵。
  6. 支持嵌套事务。
  7. 分布式事务ID可关联业务ID、业务类型、APPID,便于监控。
  8. 整合Seata的AT模式,改造行锁使其存储到本地,改造集中式TC为ET的分布式协调。

三、使用简介

  1. 业务代码组件依赖:业务代码组件已上传到中央仓库,在pom中加入依赖: xml

com.yiqiniu.easytrans easytrans – starter 1.4.3

Starter里包含了默认的组件实现,若不需要可以排除。 2. 业务发起者:框架暴露接口EasyTransFacade,使用方法如下: java @Transactional public void buySomething(int userId, long money) { // 本地业务方法,下订单,并获得订单号 JdbcTemplate jdbcTemplate = util.getJdbcTemplate(); Integer id = saveOrderRecord(jdbcTemplate, userId, money); // 声明全局事务ID transaction.startEasyTrans(BUSINESS_CODE, id); // 调用远程服务扣除所需的钱 WalletPayTccMethodRequest deductRequest = new WalletPayTccMethodRequest(); deductRequest.setUserId(userId); deductRequest.setPayAmount(money/2); Future deductFuture = transaction.execute(deductRequest); // 调用远程服务进行账务登记 AccountingRequest accountingRequest = new AccountingRequest(); accountingRequest.setAmount(money); accountingRequest.setUserId(userId); Future accountingFuture = transaction.execute(accountingRequest); // 发布消息以触发相关的业务处理 OrderMessage orderMessage = new OrderMessage(); orderMessage.setUserId(userId); orderMessage.setAmount(money); Future reliableMessage = transaction.execute(orderMessage); }

  1. 服务提供者:服务提供者实现对应的接口,并注册到Spring的Bean容器。如提供TCC服务的业务,需实现TccMethod接口: java @Component public class WalletPayTccMethod implements TccMethod<WalletPayTccMethodRequest,WalletPayTccMethodResult> { @Resource private WalletService wlletService; @Override public WalletPayTccMethodResult doTry(WalletPayTccMethodRequest param) { return wlletService.doTryPay(param); } @Override public void doConfirm(WalletPayTccMethodRequest param) { wlletService.doConfirmPay(param); } @Override public void doCancel(WalletPayTccMethodRequest param) { wlletService.doCancelPay(param); } }

四、扩展性

框架采用接口粘合各个模块,具有较强的扩展性。例如:

  1. RPC实现:目前支持DUBBO,欢迎增加对SPRINGCLOUDRIBBON/EUREKA的支持。
  2. 消息队列实现:目前支持阿里ONS及KAFKA,欢迎增加额外实现。
  3. 序列化实现:目前使用Spring – core提供的序列化,欢迎增加更高效的实现。
  4. 增删改Filter:目前有幂等Filter等,可根据需求新增。
  5. 数据源选择器:目前提供单数据源选择器,可自行实现多数据源相关的选择器。
  6. 事务执行日志的实现:目前提供基于关系数据库及REDIS的实现,可自行实现其他形式如文件系统、HBASE等的事务日志。

五、项目总结

EasyTransaction为分布式事务处理提供了全面的解决方案,从多种事务形态的统一到方便的使用方式以及良好的扩展性等方面都有不错的表现。欢迎大家在评论区留言讨论关于这个项目的任何问题或者使用心得等。

项目地址

GitHub链接直达