博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于重试机制的分布式事务方法论
阅读量:6587 次
发布时间:2019-06-24

本文共 2481 字,大约阅读时间需要 8 分钟。

hot3.png

0 来张图

总体

1 首先定义远程服务提供的服务

1.1 定义接口

/** * Created by haoran_10 on 2017/8/6. * 远程服务 */public interface RpcService {    /**     * 执行服务     * @param inParam     * @return     */    public Result
execute(ContextDTO contextDTO); /** * 取消服务 * @param contextDTO * @return */ public Result
cancel(ContextDTO contextDTO);}

1.2 返回结果

  • 成功结果
  • 业务类型错误结果
  • 不可预知系统错误结果

1.3 远程服务要求

  • 执行服务&取消服务 都要求幂等性

2.调用远程服务

public boolean doDistributedTransaction(ContextDTO contextDTO){    try{        //1.执行本地服务        callLocalService(contextDTO);        //2.执行远程服务A        try{            //2.1 调用远程服务            Result rpcA = rpcServiceA.execute(contextDTO);            //2.1.1 业务结果错误,直接返回            if(rpcA.businessError()){                log.error("call rpc execute business error,rpcA:{}",rpcA);                //抛出回滚                throw RollbackException(contextDTO);            }            //2.1.2 系统结果错误,加入重试任务            if(rpcA.systemError()){                log.error("call rpc execute system error,rpcA:{}",rpcA);                saveRetryTask(contextDTO);            }            //2.1.3  调用成功,继续下面的远程调用            if(rpcA.success()){                            }        }catch(Exception rpcAException){            //2.1.4 捕获异常,执行重试            log.error("call rpc execute is error,{}",rpcAException);            saveRetryTask(contextDTO);        }        //3. 执行远程服务B        Result rpcB = rpcServiceB.confirm(contextDTO);        //....        //n. 执行远方服务N        //...    }catch(Exception e){        //记录错误日志        log.error("doDistributedTransaction is error,contextDTO:{};e:{}",contextDTO,e);        //如果回滚异常,回滚服务        if(e instanceof  RollbackException){            rollBack(contextDTO);        }else{            saveRetryTask(contextDTO);        }    }}
  • 要求请求远程服务时,由调用方生成唯一key,确保业务唯一性

3.回滚服务

public boolean rollBack(ContextDTO contextDTO){    rpcServiceA.cancel(contextDTO);    rpcServiceB.cancel(contextDTO);    rpcServiceN.cancel(contextDTO);}
  • 这里要求取消必定成功,如果不成功,可以加入重试任务服务重试回滚

4.重试服务

//异步式执行重试任务public void retryTaskCenter(){    int defineRetryTimes = 3;//定义重试次数    while(true){        //查询出需要重试任务的数据        List
list = queryRetryTask(queryParam); for(RetryTask retryTask:list){ ContextDTO contextDTO = buildContextDTOFromRetryTask(retryTask); int retryTimes = 0; while(retryTimes

5.使用场景

  • 调用链路较短
  • 要求分布式强一致性

如果时调用链路非常长,则非常推荐使用一致性消息机制

6.end,enjoy

转载于:https://my.oschina.net/haoran100/blog/1503607

你可能感兴趣的文章
modsecurity(尚不完善)
查看>>
获取.propertys文件获取文件内容
查看>>
Redis3.0.5配置文件详解
查看>>
Keepalived+Nginx实现高可用
查看>>
Know about Oracle RAC Heartbeat
查看>>
JQuery——实现Ajax应用
查看>>
前端05.js入门之BOM对象与DOM对象。
查看>>
CISCO路由器NTP服务器配置
查看>>
oracle kill所有plsql developer进程
查看>>
12c rac 实例无法启动之磁盘组空间耗尽
查看>>
keepalived双机热备原理及实例部署LVS+keepalived
查看>>
曲线学习PyQt5方案一
查看>>
爬虫采集-基于webkit核心的客户端Ghost.py [爬虫实例]
查看>>
企业私有云之rabbitmq高可用
查看>>
OpenCV学习】矩阵运算和操作2
查看>>
nginx+ffmpeg搭建rtmp转播rtsp流的flash服务器
查看>>
Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境
查看>>
关于在arm裸板编程时使用printf问题的解决方法
查看>>
开源人工智能技术将改变一切
查看>>
2015 上半年 JavaScript 使用统计数据
查看>>