1、集群容错的配置项

  • failover - 失败自动切换,当出现失败,重试其他服务器(缺省),通常用于读操作,但重试会带来更长的延时。
  • failfast - 快速失效,只发起一次调用,失败立即报错。通常用于非幂等性写操作,比如说新增记录
  • failsafe - 失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作
  • failback - 失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作
  • forking - 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多的服务器资源。

如果没有设置集群的cluster,则默认值为:failover;在cluster默认为failover时如果没有设置retries的值,则默认使用default.retries+1 = 0+1,即重试1次,如果设置了retries的值,则使用配置的值(比如:retries=2则重试2次)。

如果dubbo的provider所提供的服务中涉及到数据库操作,最好使用failfast,避免幂等操作抛出异常,或者使用默认cluster时可能导致的数据重试插入多条等情况。

FailoverCluster相关代码:
  1. @SuppressWarnings({"unchecked", "rawtypes"})
  2. public Result doInvoke(Invocation invocation, final List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
  3. List<Invoker<T>> copyinvokers = invokers;
  4. checkInvokers(copyinvokers, invocation);
  5. int len = getUrl().getMethodParameter(invocation.getMethodName(), Constants.RETRIES_KEY, Constants.DEFAULT_RETRIES) + 1;
  6. if (len <= 0) {
  7. len = 1;
  8. }
  9. // retry loop.
  10. RpcException le = null; // last exception.
  11. List<Invoker<T>> invoked = new ArrayList<Invoker<T>>(copyinvokers.size()); // invoked invokers.
  12. Set<String> providers = new HashSet<String>(len);
  13. for (int i = 0; i < len; i++) {
  14. //Reselect before retry to avoid a change of candidate `invokers`.
  15. //NOTE: if `invokers` changed, then `invoked` also lose accuracy.
  16. if (i > 0) {
  17. checkWhetherDestroyed();
  18. copyinvokers = list(invocation);
  19. // check again
  20. checkInvokers(copyinvokers, invocation);
  21. }
  22. Invoker<T> invoker = select(loadbalance, invocation, copyinvokers, invoked);
  23. invoked.add(invoker);
  24. RpcContext.getContext().setInvokers((List) invoked);
  25. try {
  26. Result result = invoker.invoke(invocation);
  27. if (le != null && logger.isWarnEnabled()) {
  28. logger.warn("Although retry the method " + invocation.getMethodName()
  29. + " in the service " + getInterface().getName()
  30. + " was successful by the provider " + invoker.getUrl().getAddress()
  31. + ", but there have been failed providers " + providers
  32. + " (" + providers.size() + "/" + copyinvokers.size()
  33. + ") from the registry " + directory.getUrl().getAddress()
  34. + " on the consumer " + NetUtils.getLocalHost()
  35. + " using the dubbo version " + Version.getVersion() + ". Last error is: "
  36. + le.getMessage(), le);
  37. }
  38. return result;
  39. } catch (RpcException e) {
  40. if (e.isBiz()) { // biz exception.
  41. throw e;
  42. }
  43. le = e;
  44. } catch (Throwable e) {
  45. le = new RpcException(e.getMessage(), e);
  46. } finally {
  47. providers.add(invoker.getUrl().getAddress());
  48. }
  49. }
  50. throw new RpcException(le != null ? le.getCode() : 0, "Failed to invoke the method "
  51. + invocation.getMethodName() + " in the service " + getInterface().getName()
  52. + ". Tried " + len + " times of the providers " + providers
  53. + " (" + providers.size() + "/" + copyinvokers.size()
  54. + ") from the registry " + directory.getUrl().getAddress()
  55. + " on the consumer " + NetUtils.getLocalHost() + " using the dubbo version "
  56. + Version.getVersion() + ". Last error is: "
  57. + (le != null ? le.getMessage() : ""), le != null && le.getCause() != null ? le.getCause() : le);
  58. }

2、集群容错的配置

  • failover
  1. <!-- Provider side -->
  2. <dubbo:service retries="2" />
  3.  
  4. <!-- Consumer side -->
  5. <dubbo:reference retries="2" />
  6.  
  7. <!-- Consumer side,Method -->
  8. <dubbo:reference>
  9. <dubbo:method name="findFoo" retries="2" />
  10. </dubbo:reference>
  • failfast
  1. <!-- Provider side -->
  2. <dubbo:service cluster="failfast"/>
  3.  
  4. <!-- Consumer side -->
  5. <dubbo:reference cluster="failfast"/>
  • failsafe
  1. <!-- Provider side -->
  2. <dubbo:service cluster="failsafe"/>
  3.  
  4. <!-- Consumer side -->
  5. <dubbo:reference cluster="failsafe"/>
  • failback
  1. <!-- Provider side -->
  2. <dubbo:service cluster="failback"/>
  3.  
  4. <!-- Consumer side -->
  5. <dubbo:reference cluster="failback"/>
  • forking
  1. <!-- Provider side -->
  2. <dubbo:service cluster="forking"/>
  3.  
  4. <!-- Consumer side -->
  5. <dubbo:reference cluster="forking"/>

dubbo源码分析- 集群容错之Cluster(一)的更多相关文章

  1. Dubbo 源码分析 - 集群容错之 Cluster

    1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...

  2. Dubbo 源码分析 - 集群容错之 LoadBalance

    1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通 ...

  3. Dubbo 源码分析 - 集群容错之 Router

    1. 简介 上一篇文章分析了集群容错的第一部分 -- 服务目录 Directory.服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由.上一篇文章关于服务路由相关逻辑没有 ...

  4. Dubbo 源码分析 - 集群容错之 Directory

    1. 简介 前面文章分析了服务的导出与引用过程,从本篇文章开始,我将开始分析 Dubbo 集群容错方面的源码.这部分源码包含四个部分,分别是服务目录 Directory.服务路由 Router.集群 ...

  5. Dubbo源码(七) - 集群

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 集群(cluster)就是一组计算机,它们作为一个总体向用户提供一组网络资源.这些单个的计算机系 ...

  6. Dubbo源码学习--集群负载均衡算法的实现

    相关文章: Dubbo源码学习文章目录 前言 Dubbo 的定位是分布式服务框架,为了避免单点压力过大,服务的提供者通常部署多台,如何从服务提供者集群中选取一个进行调用, 就依赖Dubbo的负载均衡策 ...

  7. Dubbo 源码分析 - 服务调用过程

    注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过 ...

  8. dubbo服务引用与集群容错

    服务引用无非就是做了两件事 将spring的schemas标签信息转换bean,然后通过这个bean的信息,连接.订阅zookeeper节点信息创建一个invoker 将invoker的信息创建一个动 ...

  9. Dubbo 源码分析 - 服务导出

    1.服务导出过程 本篇文章,我们来研究一下 Dubbo 导出服务的过程.Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可 ...

随机推荐

  1. Java并发面试问题之volatile到底是什么?

    本文转载自公众号:石杉的架构笔记,阅读大约需要7分钟. 一.写在前面 前段时间把几年前带过的一个项目架构演进的过程整理了一个系列出来,参见(<亿级流量架构系列专栏总结>). 不过很多同学看 ...

  2. NumPy 之 ndarray 多维数组初识

    why 回顾我的数据分析入门, 最开始时SPSS+EXCEL,正好15年初是上大一下的时候, 因为统计学的还蛮好的, SPSS傻瓜式操作,上手挺方便,可渐渐地发现,使用软件的最不好的地方是不够灵活, ...

  3. 记vue nextTick用到的地方

    nextTick是vue提供的全局函数,在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. // 修改数据 vm.msg = 'Hello' // D ...

  4. free - 显示系统内存信息

    free - Display amount of free and used memory in the system 显示系统中空闲和已使用内存的数量 格式: free [options] opti ...

  5. 接口自动化--unittest

    今天我介绍一个测试框架:不管我们是做接口自动化还是UI自动化,我们都要用的一个框架---unittest unittest是python里面的一个单元测试框架,我们做自动化测试的话,都是要用到这个测试 ...

  6. jmeter从表格批量读取数据(一)

    1.新建一个文本文档,重命名为2.csv 2.可以在文档中设置如下参数:casenum:用例编号:url:访问路径:para:访问的域名:function:请求方式:expectValue:响应值 3 ...

  7. 【大数据】虚拟机-Ubuntu环境

    目标 1.宿主机器能相互访问 2.虚拟机能访问互联网 方法 1.VMWare--编辑---虚拟网络编辑器,选择宿主机上网网卡 2.虚拟机设置-网络适配器 3.宿主机网络设置查看 4.Ubuntu网络设 ...

  8. spring是什么?

    spring是什么? 1.编程范式的实践 dsl.注解.aop技术,扩展java语言的表达能力: dsl:xml配置+注解配置,扩展工程的组织能力: 2.基础组件: 常用组件的便捷封装,方便进行二次开 ...

  9. [React] Handle React Suspense Errors with an Error Boundary

    Error Boundaries are the way you handle errors with React, and Suspense embraces this completely. Le ...

  10. vue项目开发期间,配置webpack解决后台接口在不同服务器上的问题 之 二 ( node搭建服务 )

    由于今天上午 后端人员把接口都整合都一个服务器了,所以就没有硬关注 上一篇文章的问题, 晚上回来,用node搭了一个简单服务器,测试了下,是没有问题的.代码如下: 一. 自己初始化项目, 1.pack ...