Dubbo 学习3——集群容错模式

Dubbo 学习3——集群容错模式

Scroll Down

目前 Dubbo(2.7.4.1版本)有 10 种集群容错模式,UML 类图如下:

DubboClusters.png

这 10 种容错模式都继承自org.apache.dubbo.rpc.cluster.Cluster
ClusterDirectory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。

可参考:Dubbo 官方源码导读

FailoverCluster

Dubbo 的==默认==容错机制,失败自动切换。当出现失败,重试其它服务器。
通常用于读操作,但重试会带来更长延迟。可通过retries="2"来设置重试次数(不含第一次)。

FailfastCluster

快速失败,只发起一次调用,失败立即报错。
通常用于非幂等性的写操作,比如新增记录。

相关面试题,Dubbo中"读接口"和"写接口"有什么区别?
因为默认FailoverCluster会重试,"写"类型的接口在网络抖动情况下可能会写入多个值,所以"写"类型的接口要换成FailfastCluster

FailsafeCluster

失败安全,出现异常时,直接忽略。
通常用于写入审计日志等操作。

FailbackCluster

失败自动恢复,后台记录失败请求,定时重发。
通常用于消息通知操作。

AvailableCluster

可用性优先,遍历所有的 invokers,判断invoker.isAvalible(是否可用),只要有一个为 true 直接调用返回,否则就抛出异常。

BroadcastCluster

广播调用所有提供者,逐个调用,任意一台报错则报错。
通常用于通知所有提供者更新缓存或日志等本地资源信息。

逻辑很简单,遍历所有invokers,逐个调用每个,有异常就 catch,以免影响到剩下的调用。
AvailableCluster的区别?
BroadcastCluster需要遍历调用完全部的invoker;
AvailableCluster是只要有一个调用就 return 了。

ForkingCluster

并行调用多个服务器,只要一个成功即返回。
通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过forks="2"来设置最大并行数。

RegistryAwareCluster

优先选择本地的 invoker

MergeableCluster

按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用 group 区分,现在消费方需从每种 group 中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。

流程图如下(from 肥朝的博客,表示感谢):
MergeableCluster.png

MockClusterWrapper

本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。
主要用在本地伪装上。

流程图如下(from 肥朝的博客,表示感谢):
MockClusterWrapper.png