Dubbo集群容错方案

集群容错方案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"/>
  • 代码实现逻辑:
  1. 根据负载均衡策略选出需要调用的服务实例,排除已调用的
  2. 执行选出的实例,并将其保存到已调用列表中
  3. 执行实例成功即返回
  4. 执行实例不成功,为到最大重试次数则执行第一步,否则抛出RpcException异常

失败重试-FailbackCluster

  • 场景:调用失败时记录失败请求,定时重发
  • 配置:
<!--
retries:重试次数,不包括第一次,默认3次
failbacktasks:定时器中最大挂起任务数,默认100
-->
<dubbo:service cluster="failback" retries="5" failbacktasks="200"/>
  • 代码实现逻辑

  1. 根据负载均衡策略选出需要调用的服务实例

  2. 执行选出的实例

  3. 执行实例成功即返回

  4. 执行异常则创建延时5秒的定时任务,并加入时间轮定时器,第一次需要进行定时器初始化,分为32个时间片,每1秒滚动一次,最大挂起任务默认100个,超出最大任务数时抛出RejectedExecutionException异常。

  5. 重试执行定时任务,次数超出最大执行次数停止,并输出error日志,默认为3次。

快速失败-FailfastCluster

  • 场景:调用失败立即报错
  • 配置:
<dubbo:service cluster="failfast"/>
  • 代码实现逻辑

  1. 根据负载均衡策略选出需要调用的服务实例

  2. 执行选出的实例

  3. 执行实例成功即返回,失败抛出RpcException异常

安全失败-FailsafeCluster

  • 场景:调用失败后忽略
  • 配置:
<dubbo:service cluster="failsafe"/>
  • 代码实现逻辑

  1. 根据负载均衡策略选出需要调用的服务实例

  2. 执行选出的实例

  3. 执行实例成功即返回,失败输出error日志,并返RpcResult,视为忽略。

并发处理-ForkingCluster

  • 场景:并发调用指定数量的服务,一个成功则返回,对实时性要求交高的场景,要求快速返回,需要使用更多服务器资源。

  • 配置:
<!--
forks:最大并发数,默认2
timeout:并发返回超时时间,默认1000ms
-->
<dubbo:service cluster="forking" forks="3" timeout="500"/>
  • 代码实现逻辑

  1. 根据负载均衡策略选出几个不同的服务实例

  2. 并发执行选出的几个实例,并将返回结果放入堵塞队列中

  3. 返回堵塞队列中的第一个值,如规定时间内未获取到队列中的值或获取到异常值则返回RPC异常。

广播-BroadcastCluster

  • 场景:广播方式逐个调用服务提供者,有一个报错则返回错误,多用于通知服务提供者更新本地资源信息,如缓存,日志等。

  • 配置:
<dubbo:service cluster="broadcast"/>
  • 代码实现逻辑

  1. 循环逐个执行所有服务实例信息

  2. 保存一份返回结果和异常信息

  3. 执行完全部实例后,如异常信息不为空,则抛出异常信息,否则返回最后一个实例的结果。

可用服务-AvailableCluster

  • 场景:调用第一个可用服务

  • 配置:
<dubbo:service cluster="available"/>
  • 代码实现逻辑

  1. 循环所有服务实例信息

  2. 执行第一个可用的实例,并返回结果

  3. 如无可用实例则返回RpcException异常

合并处理-MergeableCluster

  • 场景:返回合并果或叠加处理结果

  • 配置:
<!--
merger:合并发放名
timeout:调用服务超时时间,默认1000ms
-->
<dubbo:service cluster="mergeable" merger="true" timeout="500"/>
  • 代码实现逻辑

  1. 判断merger,为空、null、0、false、N/A是执行第一个可用服务并返回结果,无可用则执行第一个实例,并返回结果。

  2. 获取方法实例的返回类型

  3. 异步调用所有实例,并将异步结果Result存储到结果集中,返回异常输出error日志

  4. 结果集为空返回RpcException,大小为1时返回第一个Result

  5. 当merger的第一个字符为“.”时,判断当merger实例返回类型不为void,且返回类型必须是结果集中第一个返回类型的父类型或相同类型时,循环执行merger实例,每一次都传入上一次的返回结果,最终返回获取最后一次结果,非上述情况时循环执行merger实例,返回结果集中的第一个结果。

  6. 当merger为true或default时使用Dubbo默认合并器,否则使用自定义merger合并器,合并后返回

默认调用-RegistryAwareCluster

  • 场景:调用注册默认标识的服务

  • 配置:
<!--
default:默认标识
-->
<dubbo:registry address="zookeeper://xxx..." default="true"/>
<dubbo:service cluster="registryaware"/>
  • 代码实现逻辑

  1. 循环所有服务实例信息

  2. 执行第一个可用的实例且default为true的实例

  3. 无默认实例则执行第一个可用的实例

  4. 无可用的实例则抛出RpcException异常

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lizz666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值