DUBBO负载均衡、集群容错、服务降级有什么区别与联系

1,177 阅读4分钟

欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习


1 文章概述

负载均衡、集群容错、服务降级这三个概念在DUBBO中非常重要,同理其它分布式框架也都有相同或者相近之概念,那么三者分别代表什么含义,有什么联系和区别,解决了什么问题,正是本文需要回答的问题。

从调用顺序角度分析,调用顺序依次是负载均衡、集群容错、服务降级。从解决问题角度分析,负载均衡解决了「选哪一个」问题,集群容错解决了「换哪一个」问题,服务降级解决了「全错怎么办」问题。


2 详细分析

2.1 调用顺序

假设有1个服务消费者面对10个提供者,这时面临第一个问题就是「选哪一个」进行调用,所以负载均衡最先调用,假设选定了5号服务提供者进行服务调用。

假设消费者调用5号提供者发生了超时异常,这时面临第二个问题就是「换哪一个」进行调用:5号超时要不要换1号试一试,或者直接返回不进行重试,所以集群容错第二个调用。

假设已经重试了1号、3号、6号提供者全部超时,这时面临「全错怎么办」这第三个问题,这时可以直接返回一个固定值或者提示文案,所以服务降级第三个调用。


2.2 负载均衡「选哪一个」

假设有1个服务消费者面对10个服务提供者,那么应该选哪一个进行调用呢?DUBBO提供以下四种负载均衡策略:


(1) RandomLoadBalance

加权随机策略


(2) RoundRobinLoadBalance

加权轮询策略


(3) LeastActiveLoadBalance

最少活跃数策略,每个提供者维护并发处理的任务个数,任务个数越大活跃度越高,消费者会选择活跃度最低的提供者


(4) ConsistentHashLoadBalance

一致性哈希策略,相同参数的请求会发给同一个提供者,并且一致性哈希算法较好地解决了某台提供者宕机可能引起的波动问题


2.3 集群容错「换哪一个」

假设消费者调用5号提供者发生了超时异常,那么应该换哪一个进行调用呢?DUBBO提供以下六种集群容错策略:


(1) Failover

故障转移策略,作为默认策略,当消费发生异常时,通过负载均衡策略再选择一个提供者节点进行调用,直到达到重试次数


(2) Failfast

快速失败策略,消费者只消费一次服务,当发生异常时则直接抛出


(3) Failsafe

安全失败策略,消费者只消费一次服务,如果消费失败则包装一个空结果,不抛出异常


(4) Failback

异步重试策略,消费发生异常时返回一个空结果,失败请求将会进行异步重试。如果重试超过最大重试次数还不成功,放弃重试并不抛出异常


(5) Forking

并行调用策略,消费者通过线程池并发调用多个提供者,只要有一个成功就算成功


(6) Broadcast

广播调用策略,消费者遍历调用所有提供者节点,任何一个出现异常则抛出异常


2.4 服务降级「全错怎么办」

假设已经重试1号、3号、6号提供者全部超时,这时可以直接返回固定值或者提示文案,不再进行重试,DUBBO提供以下三种服务降级策略:


(1) 强制降级策略

<dubbo:reference id="helloService" mock="force:return 1" interface="com.java.front.demo.provider.HelloService" />

(2) 异常降级策略

<dubbo:reference id="helloService" mock="throw com.java.front.BizException" interface="com.java.front.dubbo.demo.provider.HelloService" />

(3) 自定义降级策略

package com.java.front.dubbo.demo.consumer;
import com.java.front.demo.provider.HelloService;

public class HelloServiceMock implements HelloService {

    @Override
    public String sayHello(String name) throws Exception {
        return "test";
    }
}

配置自定义降级策略:

<dubbo:reference id="helloService" mock="com.java.front.dubbo.demo.consumer.HelloServiceMock" interface="com.java.front.demo.provider.HelloService" />

3 延伸阅读

DUBBO调用注意看不到的重试机制

DUBBO服务降级不能降级哪些异常


欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习