第6章 Dubbo集群容错与负载均衡策略

6.1 Dubbo集群容错策略概述

当我们进行系统设计时,不仅要考虑正常情况下代码逻辑应该如何走,还要考虑异常情况下代码逻辑应该怎么走。当服务消费方调用服务提供方的服务出现错误时,Dubbo提供了多种容错方案,默认模式为Failover Cluster,也就是失败重试。

下面让我们看看Dubbo提供的集群容错模式。

· Failover Cluster:失败重试

当服务消费方调用服务提供者失败后,会自动切换到其他服务提供者服务器进行重试,这通常用于读操作或者具有幂等的写操作。需要注意的是,重试会带来更长延迟。可以通过retries="2"来设置重试次数(不含第1次)。

可以使用<dubbo:reference retries="2"/>来进行接口级别配置的重试次数,当服务消费方调用服务失败后,此例子会再重试两次,也就是说最多会做3次调用,这里的配置对该接口的所有方法生效。

当然你也可以针对某个方法配置重试次数,比如:

· Failfast Cluster:快速失败

当服务消费方调用服务提供者失败后,立即报错,也就是只调用一次。通常,这种模式用于非幂等性的写操作。

· Failsafe Cluster:安全失败

当服务消费者调用服务出现异常时,直接忽略异常。这种模式通常用于写入审计日志等操作。

· Failback Cluster:失败自动恢复

当服务消费端调用服务出现异常后,在后台记录失败的请求,并按照一定的策略后期再进行重试。这种模式通常用于消息通知操作。

· Forking Cluster:并行调用

当消费方调用一个接口方法后,Dubbo Client会并行调用多个服务提供者的服务,只要其中有一个成功即返回。这种模式通常用于实时性要求较高的读操作,但需要浪费更多服务资源。如下代码可通过forks="4"来设置最大并行数:

· Broadcast Cluster:广播调用

当消费者调用一个接口方法后,Dubbo Client会逐个调用所有服务提供者,任意一台服务器调用异常则这次调用就标志失败。这种模式通常用于通知所有提供者更新缓存或日志等本地资源信息。

Dubbo本身提供了丰富的集群容错模式,但是如果你有定制化需求,可以根据Dubbo提供的扩展接口Cluster进行定制。

在3.3节中,我们了解到服务消费端具体调用的是集群容错策略的doInvoke()方法,所以下面我们主要剖析几种比较常见的集群容错的doInvoke()方法,并介绍一下如何自定义集群容错策略。在这里提醒一点,所有集群容错策略都是继承自抽象类AbstractClusterInvoker。

首先,我们来看看服务消费端发起远程调用的一个简化时序图,如图6.1所示。

图6.1

图6.1是采用默认的FailOver集群容错方法时的调用时序图,从中可以看到,调用集群容错是在服务降级策略后进行的,集群容错FailoverClusterInvoker内部首先会调用父类AbstractClusterInvoker的list()方法来获取invoker列表,即从RegistryDirectory管理的RouterChain的route()方法中获取保存的invoker列表(参见第4章)。