集群容错

集群调用失败时,Dubbo 提供的容错方案

集群调用失败时,Dubbo 提供了多种容错方案,默认值为 failover 重试。

cluster

各节点关系

  • 这里 InvokerProvider 的抽象,可以调用 ServiceInvoker 封装了 Provider 地址和 Service 接口信息
  • Directory 代表多个 Invoker,可以看作是 List<Invoker>,但与 List 不同的是,它的值可能是动态变化的,例如注册中心推送变更
  • ClusterDirectory 中的多个 Invoker 伪装成一个 Invoker,对上层透明。伪装过程包含容错逻辑,调用失败后尝试另一个
  • Router 负责根据路由规则从多个 Invoker 中选择子集,例如读写分离、应用隔离等
  • LoadBalance 负责从多个 Invoker 中为本次调用选择一个具体的,选择过程包含负载均衡算法,调用失败后需要重新选择

集群容错模式

你可以自己扩展集群容错策略,请参阅:集群扩展

Failover 集群

失败自动切换,当出现失败时,重试其他服务器。通常用于读操作,但重试会引入更长的延迟。可以通过 retries="2" 设置重试次数(不包括第一次)。

重试次数配置如下

<dubbo:service retries="2" />

<dubbo:reference retries="2" />

<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

Failfast 集群

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

Failsafe 集群

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

Failback 集群

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

Forking 集群

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可以通过 forks="2" 设置最大并行度。

Broadcast 集群

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

现在在广播调用中,可以通过 broadcast.fail.percent 配置节点调用失败比例。当达到该比例时,BroadcastClusterInvoker 将不再调用其他节点,直接抛出异常。broadcast.fail.percent 的取值范围为 0 到 100。默认情况下,当所有调用都失败时抛出异常。broadcast.fail.percent 只控制失败后是否继续调用其他节点,不改变结果(只要有一个节点报错,就报错)。broadcast.fail.percent 参数在 dubbo2.7.10 及以上版本生效。

Broadcast 集群配置 broadcast.fail.percent。

broadcast.fail.percent=20 表示当 20% 的节点调用失败时,抛出异常,不再调用其他节点。

@reference(cluster = "broadcast", parameters = {"broadcast. fail. percent", "20"})

Available 集群

调用当前可用的实例(只调用一个),若当前没有可用的实例则抛出异常。通常用于不需要负载均衡的场景。

Mergeable 集群

聚合集群中的调用结果并返回结果,通常与 group 一起使用。按分组聚合结果并返回聚合结果,例如菜单服务,使用 group 来区分同一个接口的多个实现,现在消费者需要从每个分组调用一次并返回结果,并将结果合并后返回,这样就可以实现聚合菜单项。

区域感知集群

在多注册中心订阅的场景下,实现注册中心集群间的负载均衡。多个注册中心之间地址选择有四种策略

  1. 指定优先级:preferred="true" 会优先选择该注册中心的地址
<dubbo:registry address="zookeeper://127.0.0.1:2181" preferred="true" />
  1. 同区域优先:检查当前请求所属区域,优先选择同区域的注册中心
<dubbo:registry address="zookeeper://127.0.0.1:2181" zone="beijing" />
  1. 权重轮询:按照各个注册中心的权重分配流量
<dubbo:registry id="beijing" address="zookeeper://127.0.0.1:2181" weight="100" />

<dubbo:registry id="shanghai" address="zookeeper://127.0.0.1:2182" weight="10" />
  1. 默认:选择一个可用的注册中心

集群模式配置

参考下面的例子,在服务提供者和消费者上配置集群模式

<dubbo:service cluster="failsafe" />

<dubbo:reference cluster="failsafe" />

上次修改时间:2023 年 1 月 2 日:增强英文文档 (#1798) (95a9f4f6c1c)