Dubbo的failback策略

Failback如果调用失败,则会定期重试。FailbackClusterInvoker里面定义了一个ConcurrentHashMap,专门用来保存失败的调用。定外定义了一个线程池,默认每5秒把所有失败的调用拿出来,重试一次。如果调用重试成功,则会从ConcurrentHashMap中移除,doInvoke的调用逻辑如下:
1.首先校验传入的参数。校验从AbstractClusterInvoker传入的Invoker列表是否为空。

2.负载均衡
调用select方法做负载均衡,得到要调用的节点。

3.远程调用。在try代码块中调用invoker#invoke方法做远程调用,catch到异常后直接把invocation保存到重试的ConcurrentHashMap中,并返回一个空的结果集。

4.定时线程池会定时把ConcurrentHashMap中的失败请求拿出来重新请求,请求成功则从ConcurrentHashMap中移除。如果请求还是失败,则异常也会被catch,不会影响后面的调用的重试

void retryFailed(){
  if(failed.size()==0){
    //没有失败的请求,直接退出
    return;
  }
  for(Map.Entry<Invocation,AbstractClusterInvoker<?>> entry:new HashMap<Invocation,AbstractClusterInvoker<?>>(failed).entrySet()){
    Invocation invocation = entry.getKey();
    Invoker<?> invoker = entry.getValue();
    try{
      invoker.invoke(invocation);
      failed.remove(invocation);
    }catch(Throwable e){
      ...
    }
  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值