当前位置:   article > 正文

Dubbo集群容错方案

Dubbo集群容错方案

集群容错方案support

  • FailoverCluster(默认):失败切换
  • FailbackCluster:失败重试
  • FailfastCluster:快速失败
  • FailsafeCluster:安全失败
  • ForkingCluster:并发处理
  • BroadcastCluster:广播
  • AvailableCluster:可用服务
  • MergeableCluster:合并处理
  • RegistryAwareCluster:默认标识、注册标识

配置说明

  • 方案配置方式,优先使用消费端配置
  1. <!--服务端配置-->
  2. <dubbo:service cluster="failover"/>
  3. <!--消费端配置-->
  4. <dubbo:reference cluster="failover"/>
  • 尽量在只在服务端进行配置
  • cluster类型均为小写
  • 默认为FailoverCluster失败切换方案

失败切换-FailoverCluster

  • 场景:调用失败后切换其他服务
  • 配置:
  1. <!--
  2. retries:重试次数,不包括第一次,默认2次
  3. -->
  4. <dubbo:service cluster="failover" retries="3"/>
  • 代码实现逻辑:
  1. 根据负载均衡策略选出需要调用的服务实例,排除已调用的
  2. 执行选出的实例,并将其保存到已调用列表中
  3. 执行实例成功即返回
  4. 执行实例不成功,为到最大重试次数则执行第一步,否则抛出RpcException异常

失败重试-FailbackCluster

  • 场景:调用失败时记录失败请求,定时重发
  • 配置:
  1. <!--
  2. retries:重试次数,不包括第一次,默认3次
  3. failbacktasks:定时器中最大挂起任务数,默认100
  4. -->
  5. <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

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

  • 配置:
  1. <!--
  2. forks:最大并发数,默认2
  3. timeout:并发返回超时时间,默认1000ms
  4. -->
  5. <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

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

  • 配置:
  1. <!--
  2. merger:合并发放名
  3. timeout:调用服务超时时间,默认1000ms
  4. -->
  5. <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

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

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

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/41319
推荐阅读
相关标签
  

闽ICP备14008679号