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

时间:2022-12-28 18:00:56

当我们的系统中用到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本身的高级特性.正如我们在说自己定义扩展的时候一样,这两个特征相同也能够进行自己定义扩展,用户能够依据自己实际的需求来扩展他们从而满足项目的实际需求.