目前 Dubbo(2.7.4.1版本)有 10 种集群容错模式,UML 类图如下:
这 10 种容错模式都继承自org.apache.dubbo.rpc.cluster.Cluster
。
Cluster
将Directory
中的多个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 肥朝的博客,表示感谢):
MockClusterWrapper
本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。
主要用在本地伪装上。
流程图如下(from 肥朝的博客,表示感谢):
评论区