集群容错机制原理
在单机环境下,如果服务消费者(Consumer)对服务提供者(Provider)发起一次调用请求,正好这次由于网络问题调用失败,我们可以配置服务消费者的重试策略,如 retries: 3
,可能第二次重试调用是成功的。
但是,如果服务提供者所在的节点发生故障,那么消费者无论重试调用多少次,结果都是失败的,所以需要采用集群容错模式,这样如果单服务节点因故障无法提供服务,则还可以根据配置的集群容错模式,调用其它可用的服务节点,这就提高了服务的可用性。
各节点关系:
- 这里的 Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息。
- Directory 代表多个 Invoker,可以把它看成 List
,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更。 - Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。
- Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等。
- LoadBalance 负责从多个 Invoker 中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。
配置方法
服务提供者和消费者配置集群容错模式的代码如下:
<!--服务提供者配置-->
<dubbo:service cluster="failfast" />
或者
<!--服务消费者配置-->
<dubbo:reference cluster="failfast" />
其中,容错模式就是通过cluster属性进行配置的。目前Dubbo支持6种模式,Failover、Faifast、Failsafe、Failback、Forking、Broadcast。Dubbo默认的容错模式为 failover 重试。
六种集群容错模式
Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。
重试次数配置如下:
<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
还可以配置在方法级别上
<dubbo:reference>
<dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
Failfast Cluster
配置值为 failfast,又叫快速失败模式,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,每次调用的副作用是不同的,比如新增记录,如果一次失败了就应该让其直接失败,不需要再重试。
Failsafe Cluster
配置值为 failsafe,又叫失败安全模式,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster
配置值为 failback,失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster
配置值为 failback,并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过
forks="2"
来设置最大并行数。
Broadcast Cluster
配置值为 broadcast,广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
负载均衡
Dubbo 框架内置了负载均衡的功能及扩展接口,我们可以透明地扩展一个服务或服务集群,根据需要能飞虫容易地增加或移除节点,提供服务的可伸缩性。Dubbo内置4种负载均衡策略,分别是:随机(Random)、轮询(RoundRobin)、最少活跃调用数(LeastActive)、一致性 Hash(ConsistentHash)。
配置方法
集群的负载均衡可以在服务端的服务接口级别进行配置:
<dubbo:service interface="..." loadbalance="roundrobin" />
也可以在客户端的服务接口级别进行配置:
<dubbo:reference interface="..." loadbalance="roundrobin" />
服务端方法级别配置:
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
客户端方法级别配置:
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>
集群的4种负载均衡策略
1、随机模式(Random LoadBalance)
- 随机,按权重设置随机概率。
- 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
2、轮询模式(RoundRobin LoadBalance)
- 轮询,按公约后的权重设置轮询比率。
- 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
3、最少活跃调用数(LeastActive LoadBalance)
- 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
- 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
4、一致性 Hash(ConsistentHash LoadBalance)
- 一致性 Hash,相同参数的请求总是发到同一提供者。
- 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
- 缺省只对第一个参数 Hash,如果要修改,请配置
<dubbo:parameter key="hash.arguments" value="0,1" />
- 缺省用 160 份虚拟节点,如果要修改,请配置
<dubbo:parameter key="hash.nodes" value="320" />
作者: Zealon
崇尚简单,一切简单自然的事物都是美好的。