集群容错方案support
- FailoverCluster(默认):失败切换
- FailbackCluster:失败重试
- FailfastCluster:快速失败
- FailsafeCluster:安全失败
- ForkingCluster:并发处理
- BroadcastCluster:广播
- AvailableCluster:可用服务
- MergeableCluster:合并处理
- RegistryAwareCluster:默认标识、注册标识
配置说明
- 方案配置方式,优先使用消费端配置
<!--服务端配置-->
<dubbo:service cluster="failover"/>
<!--消费端配置-->
<dubbo:reference cluster="failover"/>
- 尽量在只在服务端进行配置
- cluster类型均为小写
- 默认为FailoverCluster失败切换方案
失败切换-FailoverCluster
- 场景:调用失败后切换其他服务
- 配置:
<!--
retries:重试次数,不包括第一次,默认2次
-->
<dubbo:service cluster="failover" retries="3"/>
- 代码实现逻辑:
- 根据负载均衡策略选出需要调用的服务实例,排除已调用的
- 执行选出的实例,并将其保存到已调用列表中
- 执行实例成功即返回
- 执行实例不成功,为到最大重试次数则执行第一步,否则抛出RpcException异常
失败重试-FailbackCluster
- 场景:调用失败时记录失败请求,定时重发
- 配置:
<!--
retries:重试次数,不包括第一次,默认3次
failbacktasks:定时器中最大挂起任务数,默认100
-->
<dubbo:service cluster="failback" retries="5" failbacktasks="200"/>
-
代码实现逻辑
-
根据负载均衡策略选出需要调用的服务实例
-
执行选出的实例
-
执行实例成功即返回
-
执行异常则创建延时5秒的定时任务,并加入时间轮定时器,第一次需要进行定时器初始化,分为32个时间片,每1秒滚动一次,最大挂起任务默认100个,超出最大任务数时抛出RejectedExecutionException异常。
-
重试执行定时任务,次数超出最大执行次数停止,并输出error日志,默认为3次。
快速失败-FailfastCluster
- 场景:调用失败立即报错
- 配置:
<dubbo:service cluster="failfast"/>
-
代码实现逻辑
-
根据负载均衡策略选出需要调用的服务实例
-
执行选出的实例
-
执行实例成功即返回,失败抛出RpcException异常
安全失败-FailsafeCluster
- 场景:调用失败后忽略
- 配置:
<dubbo:service cluster="failsafe"/>
-
代码实现逻辑
-
根据负载均衡策略选出需要调用的服务实例
-
执行选出的实例
-
执行实例成功即返回,失败输出error日志,并返RpcResult,视为忽略。
并发处理-ForkingCluster
-
场景:并发调用指定数量的服务,一个成功则返回,对实时性要求交高的场景,要求快速返回,需要使用更多服务器资源。
- 配置:
<!--
forks:最大并发数,默认2
timeout:并发返回超时时间,默认1000ms
-->
<dubbo:service cluster="forking" forks="3" timeout="500"/>
-
代码实现逻辑
-
根据负载均衡策略选出几个不同的服务实例
-
并发执行选出的几个实例,并将返回结果放入堵塞队列中
-
返回堵塞队列中的第一个值,如规定时间内未获取到队列中的值或获取到异常值则返回RPC异常。
广播-BroadcastCluster
-
场景:广播方式逐个调用服务提供者,有一个报错则返回错误,多用于通知服务提供者更新本地资源信息,如缓存,日志等。
- 配置:
<dubbo:service cluster="broadcast"/>
-
代码实现逻辑
-
循环逐个执行所有服务实例信息
-
保存一份返回结果和异常信息
-
执行完全部实例后,如异常信息不为空,则抛出异常信息,否则返回最后一个实例的结果。
可用服务-AvailableCluster
-
场景:调用第一个可用服务
- 配置:
<dubbo:service cluster="available"/>
-
代码实现逻辑
-
循环所有服务实例信息
-
执行第一个可用的实例,并返回结果
-
如无可用实例则返回RpcException异常
合并处理-MergeableCluster
-
场景:返回合并果或叠加处理结果
- 配置:
<!--
merger:合并发放名
timeout:调用服务超时时间,默认1000ms
-->
<dubbo:service cluster="mergeable" merger="true" timeout="500"/>
-
代码实现逻辑
-
判断merger,为空、null、0、false、N/A是执行第一个可用服务并返回结果,无可用则执行第一个实例,并返回结果。
-
获取方法实例的返回类型
-
异步调用所有实例,并将异步结果Result存储到结果集中,返回异常输出error日志
-
结果集为空返回RpcException,大小为1时返回第一个Result
-
当merger的第一个字符为“.”时,判断当merger实例返回类型不为void,且返回类型必须是结果集中第一个返回类型的父类型或相同类型时,循环执行merger实例,每一次都传入上一次的返回结果,最终返回获取最后一次结果,非上述情况时循环执行merger实例,返回结果集中的第一个结果。
-
当merger为true或default时使用Dubbo默认合并器,否则使用自定义merger合并器,合并后返回
默认调用-RegistryAwareCluster
-
场景:调用注册默认标识的服务
- 配置:
<!--
default:默认标识
-->
<dubbo:registry address="zookeeper://xxx..." default="true"/>
<dubbo:service cluster="registryaware"/>
-
代码实现逻辑
-
循环所有服务实例信息
-
执行第一个可用的实例且default为true的实例
-
无默认实例则执行第一个可用的实例
-
无可用的实例则抛出RpcException异常