集群容错
集群调用失败时,Dubbo 提供了多种容错方案,默认值为 failover 重试。
各节点关系
- 这里
Invoker
是Provider
的抽象,可以调用Service
,Invoker
封装了Provider
地址和Service
接口信息 Directory
代表多个Invoker
,可以看作是List<Invoker>
,但与List
不同的是,它的值可能是动态变化的,例如注册中心推送变更Cluster
将Directory
中的多个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"})
提示
2.1.0
开始支持Available 集群
调用当前可用的实例(只调用一个),若当前没有可用的实例则抛出异常。通常用于不需要负载均衡的场景。
Mergeable 集群
聚合集群中的调用结果并返回结果,通常与 group 一起使用。按分组聚合结果并返回聚合结果,例如菜单服务,使用 group 来区分同一个接口的多个实现,现在消费者需要从每个分组调用一次并返回结果,并将结果合并后返回,这样就可以实现聚合菜单项。
区域感知集群
在多注册中心订阅的场景下,实现注册中心集群间的负载均衡。多个注册中心之间地址选择有四种策略
- 指定优先级:
preferred="true"
会优先选择该注册中心的地址
<dubbo:registry address="zookeeper://127.0.0.1:2181" preferred="true" />
- 同区域优先:检查当前请求所属区域,优先选择同区域的注册中心
<dubbo:registry address="zookeeper://127.0.0.1:2181" zone="beijing" />
- 权重轮询:按照各个注册中心的权重分配流量
<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" />
- 默认:选择一个可用的注册中心
集群模式配置
参考下面的例子,在服务提供者和消费者上配置集群模式
<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />