基于重试机制的分布式事务方法论

0 来张图

总体

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

1.1 定义接口

/**
 * Created by haoran_10 on 2017/8/6.
 * 远程服务
 */
public interface RpcService {

    /**
     * 执行服务
     * @param inParam
     * @return
     */
    public Result<T> execute(ContextDTO contextDTO);

    /**
     * 取消服务
     * @param contextDTO
     * @return
     */
    public Result<T> 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<RetryTask> list = queryRetryTask(queryParam);
        for(RetryTask retryTask:list){
            ContextDTO contextDTO = buildContextDTOFromRetryTask(retryTask);
            int retryTimes = 0;

            while(retryTimes<defineRetryTimes){
                //继续执行远程服务
                //这里可根据状态定位到执行调用哪一个远程服务,避免每次重复调用
                doDistributedTransaction(contextDTO);
                retryTimes++;
            }
        }
    }
}

5.使用场景

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

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

6.end,enjoy

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分布式事务常见的事务处理机制包括XA模式、TCC模式、可靠消息服务和AT模式。 XA模式,也称为两阶段提交协议(2PC),是一种常见的分布式事务处理机制。在该模式中,一个分布式事务可以被拆分成多个本地事务,运行在不同的微服务中。每个本地事务都必须要保证能够同时成功,如果有一个本地事务失败,则其他事务都必须回滚。这个过程需要一个协调者(TM)和资源参与者(RM),并使用通信中间件(CRM)来通知各个本地事务执行的状态。然而,XA模式存在单点故障的问题,如果协调者故障了,参与者无法得知上一阶段它们是否执行成功,并且在准备阶段和提交阶段,每个事务参与者都会锁定本地资源并等待其他事务的执行结果,导致效率降低。 TCC模式是另一种常见的分布式事务处理机制。TCC代表Try-Confirm-Cancel,即尝试、确认、取消。在TCC模式中,事务被拆分为三个阶段:尝试阶段,确认阶段和取消阶段。在尝试阶段,事务参与者尝试执行操作并预留相应的资源;在确认阶段,事务参与者确认操作;在取消阶段,事务参与者取消操作并释放资源。TCC模式相对于XA模式来说,实现上更加灵活,但需要业务代码来实现,而不是由数据库实现,因此效率相对较高。 可靠消息服务是一种使用消息队列来实现的分布式事务处理机制。在该模式中,事务参与者将事务操作封装为消息,然后将消息发送到消息队列中。事务协调者从消息队列中接收消息,并根据消息的状态来判断是否确认或取消操作。可靠消息服务可以保证消息的可靠传递,但可能会出现消息重复或丢失的情况,需要通过设计来解决这些问题。 AT模式是另一种分布式事务处理机制,代表了应用层事务。在AT模式中,事务参与者通过在资源操作前后插入代码来实现事务的管理。在操作前,事务参与者记录操作前的状态,并在操作后根据操作结果决定是否提交或回滚事务。AT模式相对于XA模式来说,实现起来更加简单,但需要在业务代码中显式管理事务。 以上是分布式事务常见的事务处理机制,每种机制都有其优缺点,选择合适的机制取决于具体的业务需求和系统架构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [分布式服务常见问题—分布式事务](https://blog.csdn.net/sanmi8276/article/details/113849988)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [分布式事务常见的几种实现方式](https://blog.csdn.net/qq_45968950/article/details/127408359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值