限流、熔断

1.限流

1.1 定义

概念: 限制服务方接口调用流量,对服务端的请求进行限制。

限流的原因可能有很多,如突发热点事件导致服务请求QPS过高,导致服务器性能不足;限制用户某些操作的频次,如接口被刷等。

限流有时候是为了让自己服务不被打垮,有时候是为了让别人服务不被打垮;

此处列举一个常见的限流场景:

1.2 限流算法

1.2.1 计数器算法

public void rateLimit(String conditionKey, LimiterConfig limiterConfig) {
    //可以利用Apollo动态配置
    LimiterConfig config = Apollo.getConfig(limiterConfig);
    if (config == null) {
        return;
    }
    //访问次数+1
    Long count = redisTemplate.opsForValue().increment(condition, Constant.IntegerNumber.ONE);
    //刷新key的失效时间
    if (Constant.LongNumber.ONE.equals(count)) {
        redisTemplate.expire(condition, config.getTimeCycle(), TimeUnit.SECONDS);
    }
    //限流操作,抛出异常
    if (count > detail.getLimitValue()) {
        log.error("rateLimit operating frequently");
        throw new LimitException(ResponseCodeEnum.OPERATING_FREQUENTLY);
    }
}

1.2.2 漏桶算法

漏桶原理图

1.2.3 令牌桶算法

令牌桶原理图

1.2.4 使用场景

并不能认为令牌桶一定比漏桶好,使用场景不一样。

  1. 令牌桶可以用来保护自己,主要用来对调用者频率进行限流,为的是让自己不被打垮。所以如果自己本身有处理能力的时候,如果流量突发(实际消费能力强于配置的流量限制),那么实际处理速率可以超过配置的限制。
  2. 漏桶算法,可以用来保护我们所调用的系统。主要场景是,当调用的第三方系统本身没有保护机制,或者有流量限制的时候,我们的调用速度不能超过他的限制,由于我们不能更改第三方系统,所以只有在主调方控制。这个时候,即使流量突发,也必须舍弃。因为消费能力是第三方决定的。

总结:

1.3 限流粒度

2. 熔断、降级

2.1 定义

概念

区别:熔断和降级有什么区别?

2.2 熔断实现方式

AOP,符合条件则熔断

3. 主流框架

3.1 Sentinal(Alibaba)

Sentinal官方文档

3.2 Hystrix(SpringClould)

Hystrix官方文档

3.3 Resilience4j

Resilience4j官方文档