当前位置: 首页 > news >正文

Dubbo之旅--集群容错和负载均衡

 

       当我们的系统中用到Dubbo的集群环境,由于各种原因在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重试。

 

       Dubbo的集群容错在这里想说说他是由于我们实际的项目中出现了此类的问题,由于依赖的第三方项目出现异常,导致dubbo调用超时,此时使用的是默认的集群容错方式,而配置的reties='3',这样前段系统连续掉用了三次服务,结果可想而知.

 

     先说一下各节点关系:

 

       这里的Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。

        Directory代表多个Invoker,能够把它看成List<Invoker>,但与List不同的是,它的值可能是动态变化的。比方注冊中心推送变更。

         Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包括了容错逻辑,调用失败后。重试还有一个。

         Router负责从多个Invoker中按路由规则选出子集,比方读写分离,应用隔离等。

         LoadBalance负责从多个Invoker中选出详细的一个用于本次调用。选的过程包括了负载均衡算法,调用失败后,须要重选。

 

   集群容错模式:

 

   Failover Cluster

失败自己主动切换,当出现失败。重试其他server。(缺省)

通经常使用于读操作,但重试会带来更长延迟。

可通过retries="2"来设置重试次数(不含第一次)。正是文章刚開始说的那种情况.

  Failfast Cluster

高速失败,仅仅发起一次调用。失败马上报错。

通经常使用于非幂等性的写操作,比方新增记录。

  Failsafe Cluster

失败安全,出现异常时,直接忽略。

通经常使用于写入审计日志等操作。

  Failback Cluster

失败自己主动恢复,后台记录失败请求,定时重发。

通经常使用于消息通知操作。

  Forking Cluster

并行调用多个server,仅仅要一个成功即返回。

通经常使用于实时性要求较高的读操作。但须要浪费很多其它服务资源。

可通过forks="2"来设置最大并行数。

  Broadcast Cluster

广播调用全部提供者,逐个调用,随意一台报错则报错。(2.1.0開始支持)

通经常使用于通知全部提供者更新缓存或日志等本地资源信息。

重试次数配置如:(failover集群模式生效)

 

<dubbo:serviceretries="2"/>

或:

 

<dubbo:referenceretries="2"/>

或:

 

<dubbo:reference>

   <dubbo:methodname="findFoo"retries="2"/>

</dubbo:reference>


集群模式配置如:

 

<dubbo:servicecluster="failsafe"/>

或:

 

<dubbo:referencecluster="failsafe"/>

 

 

        以上是Dubbo集群的容错方式,接下来是在集群负载均衡时,Dubbo提供了多种均衡策略。缺省为random随机调用。

 

    Random LoadBalance

随机,按权重设置随机概率。

在一个截面上碰撞的概率高。但调用量越大分布越均匀,并且按概率使用权重后也比較均匀。有利于动态调整提供者权重。

    RoundRobin LoadBalance

轮循。按公约后的权重设置轮循比率。

存在慢的提供者累积请求问题,比方:第二台机器非常慢,但没挂,当请求调到第二台时就卡在那。久而久之。全部请求都卡在调到第二台上。

    LeastActive LoadBalance

最少活跃调用数。同样活跃数的随机。活跃数指调用前后计数差。

使慢的提供者收到更少请求,由于越慢的提供者的调用前后计数差会越大。

   ConsistentHash LoadBalance

一致性Hash,同样參数的请求总是发到同一提供者。

当某一台提供者挂时。原本发往该提供者的请求,基于虚拟节点,平摊到其他提供者,不会引起剧烈变动。

 

       Dubbo的集群容错和负载均衡相同也是Dubbo本身的高级特性.正如我们在说自己定义扩展的时候一样,这两个特征相同也能够进行自己定义扩展,用户能够依据自己实际的需求来扩展他们从而满足项目的实际需求.


相关文章:

  • 动态权限树控件
  • 南桥-- 算法训练 2的次幂表示
  • 第九章:XML文档集成---AxInternalBase API
  • 微信登陆
  • 文本相似度计算--余弦定理和广义Jaccard系数
  • 结构型模型Bridge
  • PHP实现程序单例执行
  • Visual C#.Net网络程序开发-Tcp篇(3)
  • [New Portal]Windows Azure Virtual Machine (3) 在VM上挂载磁盘
  • ajax.net 我曾经轻视了他,郁闷。
  • 彻底去除Win10“快速访问”
  • 网络服务器时间发布地址
  • 《Python地理数据处理》——2.3 变量
  • 只能使用数组初始值设定项表达式为数组类型赋值。请尝试改用新的表达式
  • 《Total Commander:万能文件管理器》——12.3.高人高见
  • 收藏网友的 源程序下载网
  • 2018一半小结一波
  • Akka系列(七):Actor持久化之Akka persistence
  • Javascript Math对象和Date对象常用方法详解
  • MySQL QA
  • Sequelize 中文文档 v4 - Getting started - 入门
  • session共享问题解决方案
  • spring + angular 实现导出excel
  • SpringCloud集成分布式事务LCN (一)
  • Twitter赢在开放,三年创造奇迹
  • vue的全局变量和全局拦截请求器
  • 不上全站https的网站你们就等着被恶心死吧
  • 构建二叉树进行数值数组的去重及优化
  • 回顾2016
  • 记一次用 NodeJs 实现模拟登录的思路
  • 讲清楚之javascript作用域
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用 @font-face
  • 线性表及其算法(java实现)
  • 学习Vue.js的五个小例子
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 《天龙八部3D》Unity技术方案揭秘
  • 2017年360最后一道编程题
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # Maven错误Error executing Maven
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (二十四)Flask之flask-session组件
  • (附源码)php投票系统 毕业设计 121500
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (十六)Flask之蓝图
  • (四)linux文件内容查看
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)基于IDEA的JAVA基础12
  • (转)Oracle存储过程编写经验和优化措施
  • *p++,*(p++),*++p,(*p)++区别?
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net 7 上传文件踩坑