Dubbo-集群容错之Cluster

本文详细介绍了Dubbo的集群容错机制,包括Failover、Failfast、Failback、Failsafe、Broadcast、Available、Forking和Mergeable等八种策略。通过源码分析,阐述了各种容错策略的特点和适用场景,例如Failover适用于读操作,Failfast适用于非幂等性写操作,而Broadcast用于通知所有提供者更新本地资源。同时,还提到了MockClusterWrapper实现的服务降级策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插播面试题

看源码我比较喜欢带着目的性,带着问题看源码

  1. dubbo中"读接口"和"写接口"有什么区别?
  2. 谈谈dubbo中的不同容错机制及特点?

集群容错架构设计

首先上一张Dubbo官网的集群容错的架构设计图
在这里插入图片描述

其中有几个关键角色

  1. Directory:其用途是保存 Invoker,可简单类比为 List。其实现类 RegistryDirectory 是一个动态服务目录,可感知注册中心配置的变化,它所持有的 Invoker 列表会随着注册中心内容的变化而变化
  2. Router:可以简单理解为过滤器(路由),用户可以配置自己的路由规则,从而过滤掉不符合规则的Invoker
  3. LoadBalance:LoadBalance是负载均衡的抽象接口,负责从Router路由规则过滤后的Invoker列表中选择一个最终调用的Invoker
  4. Invoker:这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息

还有一个Cluster没介绍,Cluster又是什么作用呢?

集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。这样一来,服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理

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

既然Cluter中包含了集群容错的场景,那么就从接口层面入手,看下Cluster到底有几种容错机制

在这里插入图片描述
可以看到Cluster接口的默认实现是FailoverCluster(失败重试),容错机制共有10种,从经常使用的开始介绍

FailoverCluster

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

FailoverClusterInvoker#doInvoke方法实现如下
在这里插入图片描述

FailfastCluster

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

FailfastClusterInvoker#doInvoke方法如下
在这里插入图片描述

看到这里,大家可能就会联想到”面试官问Dubbo中读接口、写接口“这个问题的答案了

  • 读接口天然具有幂等性,因此失败重试是较好的选择,可以选择使用FailOver失败重试容错机制
  • 写接口如果没有代码层面实现幂等,使用FailOver失败重试时可能会产生并发写入问题,因此写操作最好配置为FailfastCluster快速失败容错机制

FailbackCluster

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

FailbackClusterInvoker#doInvoke方法实现如下
在这里插入图片描述
addFailed实现如下
在这里插入图片描述

RetryTimerTask重试任务的run方法如下,可以看到,失败时会不断reput,不断进行重试调用
在这里插入图片描述

FailsafeCluster

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

FailsafeClusterInvoker#doInvoke实现如下,比较简单,直接忽略异常,返回一个RpcResult
在这里插入图片描述

BroadcastCluster

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

BroadcastClusterInvoker#doInvoke实现如下
在这里插入图片描述

AvailableCluster

遍历提供者列表,找到第一个第一个可用的服务,直接调用,不做负载均衡操作

AvailableClusterInvoker实现如下
在这里插入图片描述

ForkingCluster

ForkingClusterInvoker 会在运行时通过线程池创建多个线程,并发调用多个服务提供者。只要有一个服务提供者成功返回了结果,doInvoke 方法就会立即结束运行

ForkingClusterInvoker 的应用场景是在一些对实时性要求比较高读操作(注意是读操作,并行写操作可能不安全)下使用

ForkingClusterInvoker#doInvoke代码如下,核心就是线程池+阻塞队列的使用,通过BlockingQueue#poll方法来阻塞等待一个返回的rpc调用结果

在这里插入图片描述

MergeableCluster

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

该种策略使用较少,不做分析

MockClusterWrapper

服务降级的Mock的实现,在Rpc调用异常,服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略

先看看怎么都有几种使用方式

<dubbo:reference id="demoService"  interface="xxx.xxx.DemoService">
     <!-- 调用异常时,抛出MockException -->
     <dubbo:method name="testService2" mock="throw com.foo.MockException"></dubbo:method>
     <!-- 强制返回null,不会走远程调用 -->
     <dubbo:method name="testService3" mock="force:return null"></dubbo:method>
     <!-- 远程调用异常时返回null -->
     <dubbo:method name="testService3" mock="fail:return null"></dubbo:method>
     <!-- 通过BarServiceMock构造返回数据 -->
     <dubbo:method name="testService3" mock="com.foo.BarServiceMock"></dubbo:method>
 </dubbo:reference>
  • mock="throw com.foo.MockException"表示调用失败时抛出MockException异常
  • mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响,主要用于测试
  • mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响
  • mock="com.foo.BarServiceMock"表示调用失败时通过BarServiceMock类来自定义Mock返回数据

更多细节可以看Dubbo官网介绍本地伪装

再看下代码是怎么实现的,MockClusterInvoker#invoke中代码如下
在这里插入图片描述

在看下具体的mock返回值方法doMockInvoke的实现逻辑
在这里插入图片描述

其核心就是MockInvoker.invoke的实现

在这里插入图片描述

看到这里应该对面试题中第二个问题:dubbo中的不同容错机制及特点?有了答案

下面给出总结

容错机制名称特点及应用场景
FailoverCluster失败自动切换失败自动切换,当出现失败,重试其它服务器 。通常用于读操作,但重试会带来更长延迟
FailfastCluster快速失败只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录
FailbackCluster失败自动恢复失败时,后台记录失败请求,定时重发。通常用于消息通知操作
FailsafeCluster失败安全出现异常时,直接忽略。通常用于写入审计日志等容忍失败的操作
BroadcastCluster广播调用多个服务提供者调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息
AvailableCluster调用一个可用的提供者找到第一个第一个可用的服务,直接调用,不做负载均衡操作
ForkingCluster并行调用多个服务提供者通过线程池创建多个线程,并发调用多个服务提供者,只要有一个服务提供者成功返回了结果,适用于对实时性要求比较高的场景
MergeableCluster分组聚合合并返回多个分组的调用结果
MockClusterWrapperMock服务降级(本地伪装)服务降级的Mock的实现,在Rpc调用异常,服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值