编辑: 摇摆白勺白芍 | 2019-07-17 |
branchId为子事务Id,用于区分子事务的父子关 系和子事务之间的调用顺序 Try 函数返回 Throwable 异常;
Try 函数的返回值为 void,TCC 通过异常返回失败结果. Confirm 和Cancel 函数返回值为 Boolean 类型,操作成功返回 true,操作失败返回 false. 示例:子事务函数定义 public interface SubService { @TsfTcc(serviceName = subService , type = TransactionType.BRANCH, confirmMethodName = sub Confirm , cancelMethodName = subCancel ) public void subTry(String txId,long branchId,MyParams params) throws Throwable;
public boolean subConfirm(String txId,long branchId,MyParams params) throws Throwable;
public boolean subCancel(String txId,long branchId,MyParams params) throws Throwable;
} 示例:主事务与子事务结合 腾讯微服务平台 版权所有:腾讯云计算(北京)有限责任公司 第7 共13页public class MainTransaction { SubService subService;
@TsfTcc(serviceName = myTcc , type = TransactionType.ROOT, timeout_ms = 60000) public String beginTcc(MyParams params) throws Throwable { subService.subTry(null,0,params);
} } 检查事务调用 启动服务,从外部调用主事务函数,调用完成之后查看业务日志,一次成功的事务调用日志如下: 14:21:30.470 INFO [main] executeLog - begin transaction: 775025cf-d3e6-3fe8-8c8f-31d44fcde46d 14:21:30.649 INFO [main] executeLog - transaction: 775025cf-d3e6-3fe8-8c8f-31d44fcde46d branc h index
1 succ,retry times:
0 14:21:30.652 INFO [main] executeLog - confirm 775025cf-d3e6-3fe8-8c8f-31d44fcde46d branch in dex: 1, times:
1 14:21:30.653 INFO [main] executeLog - commit 775025cf-d3e6-3fe8-8c8f-31d44fcde46d branch in dex:
1 succ 14:21:30.653 INFO [main] executeLog - transaction:775025cf-d3e6-3fe8-8c8f-31d44fcde46d confirm succ 子事务访问外部服务 在SpringCloud 中,您可以通过集成 FeignClient 访问外部服务,再次以上述的子事务为例,假如子事务需要调用 一个代金券服务的相关接口,则配置如下: @FeignClient(value = couponService ) @RequestMapping(value = /api/v6/data/couponService ) public interface SubService { @TsfTcc(serviceName = subService , type = TransactionType.BRANCH, confirmMethodName = sub Confirm , cancelMethodName = subCancel ) @RequestMapping(value = /try , method = RequestMethod.POST) public void subTry(String txId,long branchId,MyParams params) throws Throwable;
@RequestMapping(value = /confirm , method = RequestMethod.POST) 腾讯微服务平台 版权所有:腾讯云计算(北京)有限责任公司 第8 共13页public boolean subConfirm(String txId,long branchId,MyParams params) throws Throwable;
@RequestMapping(value = /cancel , method = RequestMethod.POST) public boolean subCancel(String txId,long branchId,MyParams params) throws Throwable;
} 在接口上增加了如下注解: @FeignClient(value = couponService ) ,value 的值为外部服务在服务注册中心注册的服务名. @RequestMapping(value = /api/v6/data/couponService ) ,value 的值为外部服务的根 URL. 在方法上增加了如下注解: @RequestMapping(value = /try , method = RequestMethod.POST) ,value 的值为外部服务的 API 的URL 和请求方式. 由于分布式事务框架本身会针对异常的调用做重试,业务方在调用事务相关接口(包含主事务和子事务)的时候请 关闭请求重试策略.这里以 Spring Cloud 标准的 FeignClient 和Ribbon 为例,指导如何关闭请求重试策略. FeignClient 默认是不会进行重试的,如果业务自定义了 FeignClient 上面的 retryer,取消自定义配置即可. Ribbon 默认的配置是,当请求失败时,会选择另外一个可用的服务实例进行重试,因此需要手动配置 Ribbon 重试策略. i. 为项目创建一个 Spring boot 的标准配置文件 application.properties,如果项目已经有 Spring boot 的properties 文件,可以不额外创建,直接添加内容即可. ii. 指定关闭某个服务的自动重试策略.在配置文件中添加配置项: couponService.ribbon.MaxAutoRetriesNextServer=0 couponService.ribbon.MaxAutoRetries=0 上述配置表示当调用服务名为 couponService 的服务时,关闭 Ribbon 的自动重试,服务名根据业务实际情 况进行填写. 分布式事务的超时和重试机制 用户可以在主事务的注释中定义超时时间,默认超时时间为60秒,此时的超时时间为整个事务的超时时间.当事务 超时后,事务管理器对事务进行接管,以每5秒一次的重试频率自动触发重试,重试频率逐渐增长,直到600秒.用 户可以在控制台上控制中断这一重试过程,也可以手动触发重试.7天后,重试自动终止. 对于未超时的事务,Try 阶段自动重试3次,3次重试不成功自动触发 Cancel 进行回滚.对于 Confirm 或者 Cancel 阶段始终不能执行成功的情况,会重试直到超时.超时后由事务管理器接管. 腾讯微服务平台 版权所有:腾讯云计算(北京)有限责任公司 第9 共13页 查询事务信息 1. 登录 TSF 控制台. 2. 在左侧导航栏中,单击【事务管理】. 3. 在事务管理界面,选择需要查看的事务时间段、事务状态,并填写关键词.关键词可以选择事务相关的服务名、 方法名称. 4. 单击【查询】按钮,可查看事务 ID、起始节点、超时时长等相关信息. 5. 在查询结果列表中,单击主事务 ID,可以查看主事务下的子事务运行状态,包括子事务的方法名、服务名、节点、状态、起止时间等信息. 每一次子事务发起的请求都会记录在子事务列表中,包含子事务的确认、取消、重试等.当子事务发生重试时, 您可以查看子事务重试原因(由主事务触发、由事务管理器启动发起或者由用户在控制台上手动触发). 6. 在子事务列表中,单击操作列的【查看事务参数】,可以查看每条子事务的参数内容. 处理已超时事务 当主事务的处理时间超过了 SDK 中设置的超时时限后,系统会认为事务已处于超时状态.针对超时事务,TSF 提供 了两种重试渠道:自动重试和手动重试. 自动重试 控制台基本操作 最近更新时间:2019-04-12 18:08:44 腾讯微服务平台 版权所有:腾讯云计算(北京)有限责任公司 第10 共13页 当事务超时时,框架自动重试,重试时间间隔从5秒/次倍速递增直到600秒/次,当超时时间超过7天后,会自动停止 重试. 手动重试 用户可以在控制台上,通过鼠标点击的方式触发重试. 1. 登录 TSF控制台. 2. 在左侧导航栏中,单击【事务管理】. 3. 批量选择需要进行手动重试或需要停止/触发自动重试的事务,单击【手动触发重试】. 腾讯微服务平台 版权所有:腾讯云计算(北京)有限责任公司 第11 共13页 业务场景 本样例是常见的一个线上的代金券/现金协同购物场景.在进行购物的时候,消费用户可以通过使用代金券来抵消一 部分的现金费用:用户在消费的时候出示一张2元的代金券,在购买价值20元的物品的时候,只需要从微信钱包中支 付18元即可. 在整个购物事务场景中,假设涉及三个的不同子服务:代金券服务、微信钱包服务以及商家账务服务.各个子服务 部署在不同的节点上,使用不同的数据库.本样例展示了如何使用 TCC 来完成一次跨服务/跨数据库的分布式事务. 样例模块说明 下载样例 >