限流降级方案

目录

1、限流的几种算法实现

1.1 固定窗口算法

1.2 滑动窗口算法

1.3 漏桶算法

1.4 令牌桶算法

2. Sentinel能力说明

2.1 Sentinel与Hystrix对比

2.2 流量控制

2.3 熔断

2.4 降级

3. Dashboard能力说明

3.1 Dashboard容错性

4. 集群限流方案

​​​​​​​4.1 背景

​​​​​​​4.2 架构逻辑图

 4.3 各个组件角色说明

5. 客户端服务接入说明

5.1 版本说明

5.2 接入方式

​​​​​​​5.1.1 Spring cloud接入​​​​​​​

​​​​​​​5.1.2 FeignClient接入

​​​​​​​5.1.3 RestTemplate接入

6. 实践篇

6.1 超出预期的流量洪峰

​​​​​​​6.2 调用第三方的场景

6.3 线上高保链路


1、限流的几种算法实现

1.1 固定窗口算法

固定窗口算法又叫计数器算法,是一种简单方便的限流算法。主要通过一个支持原子操作的计数器来累计 1 秒内的请求次数,当 1 秒内计数达到限流阈值时触发拒绝策略。每过 1 秒,计数器重置为 0 开始重新计数。

优点:实现简单

缺点:遇到时间窗口的临界突变时,如 1s 中的后 500 ms 和第 2s 的前 500ms 时,虽然是加起来是 1s 时间,却可以被请求 4 次。

1.2 滑动窗口算法

然固定窗口算法在遇到时间窗口的临界突变时会有问题,那么我们在遇到下一个时间窗口前也调整时间窗口不就可以了吗?

优点:一定程度上缓解了固定窗口存在的临界突变问题

缺点:只是降低了概率,并没有从根本上解决问题

1.3 漏桶算法

漏桶算法中的漏桶是一个形象的比喻,这里可以用生产者消费者模式进行说明,请求是一个生产者,每一个请求都如一滴水,请求到来后放到一个队列(漏桶)中,而桶底有一个孔,不断的漏出水滴,就如消费者不断的在消费队列中的内容,消费的速率(漏出的速度)等于限流阈值。即假如 QPS 为 2,则每 1s / 2= 500ms 消费一次。漏桶的桶有大小,就如队列的容量,当请求堆积超过指定容量时,会触发拒绝策略。

 

优点:解决了滑动窗口存在的临界突变问题。

缺点:漏桶模式中的消费处理总是能以恒定的速度进行,可以很好的保护自身系统不被突如其来的流量冲垮;但是这也是漏桶模式的缺点,假设 QPS 为 2,同时 2 个请求进来,2 个请求并不能同时进行处理响应,因为每 1s / 2= 500ms 只能处理一个请求。

1.4 令牌桶算法

系统服务作为生产者,按照指定频率向桶(容器)中添加令牌,如 QPS 为 2,每 500ms 向桶中添加一个令牌,如果桶中令牌数量达到阈值,则不再添加。

请求执行作为消费者,每个请求都需要去桶中拿取一个令牌,取到令牌则继续执行;如果桶中无令牌可取,就触发拒绝策略,可以是超时等待,也可以是直接拒绝本次请求,由此达到限流目的。

2. Sentinel能力说明

Sentinel是阿里巴巴开源的一个微服务治理组件,面向微服务系统,以流量为入口提供限流、熔断、降级等能力。控制的粒度可以是http接口、方法和代码段。

 

2.1 Sentinel与Hystrix对比

Sentinel

Hystrix

熔断降级策略

基于慢调用比例、异常比例、异常数

基于异常比例

动态规则配置

可支持多种方式的规则配置,灵活动态

不支持动态配置

熔断颗粒度

http接口、方法、代码段

只支持http接口

扩展性

基于多个扩展点,支持SPI

插件形式

流量控制

支持冷启动、匀速器

不支持

监控数据

使用dashboard可以看到实时监控数据

只能看到简单的数据

2.2 流量控制

Sentinel进行流量控制主要有两种方式,一种是统计线程数,另外一种则是统计 QPS。

统计线程数是为了保护业务线程数不被耗尽,例如,在zuul网关的场景下,zuul转发用户的请求,如果下游某个服务因为某种原因出现延迟或者响应慢的情况,这时候如果用户请求持续进入,就会出现zuul线程池资源被大量占用,极端情况导致线程资源耗尽出现拒绝服务。Sentinel通过信号量的方式统计当前请求上下文中线程个数,如果超出了阈值,新的请求就被拒绝。

QPS(每秒请求数)流量控制,当请求超过设定的阈值后,则采取流量控制措施。可采用的控制手段有直接拒绝、冷启动(缓慢增加流量)、匀速器(令牌桶),冷启动和匀速器主要应用在处理间隔性突发流量的场景。

2.3 熔断

熔断是指在调用外部依赖服务时,暂时切断不稳定的服务调用,避免局部不可用导致整体服务雪崩。例如,A服务可能会调用外部第三方的B接口,如果第三方的B接口响应变长,A服务一直无法收到响应,造成调用线程堆积,严重时可能会将发票服务的资源耗尽。

Sentinel提供了三种熔断策略:

慢调用比例:就是针对慢调用请求的比例,在单位时间内,慢调用的请求大于最小请求数,且比例大于阈值,就会触发熔断,在第一个熔断时长后,会开启监测状态,如果服务恢复,熔断器关闭,如果服务未恢复,接着触发一个熔断时长。

异常比例:根据单位时间内异常的比率,进行熔断。

异常数:根据异常的个数进行触发熔断。

2.4 降级

降级是指在依赖服务被熔断时,直接返回一个提前准备好的fallback逻辑,并且在熔断时间内,都会直接返回这个fallback。

3. Dashboard能力说明

Dashboard是一个开源的Sentinel控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。在Sentinel架构中提供可视化的数据展示和动态规则配置,界面如下图:

Dashboard作为Sentinel架构中的注册中心和配置中心,需要和被接入系统保持网络畅通,被接入系统在启动时会将自身信息注册到Dashboard,并且在持续的发送心跳包。

Dashborad也会定时的向被接入服务拉取统计数据。当有配置信息变更时,下发配置。

3.1 Dashboard容错性

Dashborad在Sentinel架构中只是提供了一个图形化的控制台页面,熔断降级的功能并不强依赖Dashboard,在微服务系统中,即使Dashboard挂了,或者网络原因失联,都不会影响到接入系统的使用。

4. 集群限流方案

​​​​​​​4.1 背景

群流控可以解决流量不均匀导致总体限流效果不佳的问题。假设集群中有 10 台机器,我们给每台机器设置单机限流阈值为 10 QPS,理想情况下整个集群的限流阈值就为 100 QPS。不过实际情况下流量到每台机器可能会不均匀,会导致总量没有到的情况下某些机器就开始限流。因此仅靠单机维度去限制的话会无法精确地限制总体流量。而集群流控可以精确地控制整个集群的调用总量,结合单机限流兜底,可以更好地发挥流量控制的效果。

​​​​​​​4.2 架构逻辑图

 

 4.3 各个组件角色说明

组件

说明

Sentinel Dashboard

它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能

远程配置中心

持久化限流规则,规则变更时,将变更推送到各个客户端

Sentinel客户端

集群流控客户端,用于向所属 Token Server 通信请求 token。集群限流服务端会返回给客户端结果,决定是否限流

Token Server

即集群流控服务端,处理来自 Token Client 的请求,根据配置的集群规则判断是否应该发放 token(是否允许通过)。

5. 客户端服务接入说明

5.1 版本说明

由于spring boot 的几个大版本之间存在一些不兼容,所以客户端在接入sentinel的时候需要引入对应的版本才可以正常运行。​​​​​​​建议官网查询。

5.2 接入方式

如果客户端已经开启了Hystrix熔断,hystrix和Sentinel会同时生效,建议的将hystrix关闭,保留一个熔断器即可。

关闭hystrix配置如下:

feign.hystrix.enabled=false

在启动类上注释 断路器

//@EnableCircuitBreaker

​​​​​​​5.1.1 Spring cloud接入

  1. 引入maven依赖

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>

<version>1.5.1.RELEASE</version>

</dependency>

     2. 添加配置属性

spring.cloud.sentinel.transport.dashboard=ip:port

​​​​​​​5.1.2 FeignClient接入

  1. 引入maven依赖

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-openfeign</artifactId>

</dependency>

     2. 添加配置属性

feign.sentinel.enabled=true

​​​​​​​5.1.3 RestTemplate接入

  1. 添加注解支持

@Bean

@SentinelRestTemplate

public RestTemplate restTemplate() {

    return new RestTemplate();

}

6. 实践

6.1 超出预期的流量洪峰

在业务高峰期,无法有效评估出这个峰值的具象值和持续时间,并且不具备服务集群弹性伸缩(动态扩缩容)的能力,那么我们的服务依然有被打垮的风险。

​​​​​​​6.2 调用第三方的场景

在某些调用第三方接口的场景下,例如调用A接口,调用发送短信接口等,因为外部的三方服务,我们不可控,所有我们需要配置限流规则保护自身应用,避免三方服务异常,级联影响到我们自身服务。​​​​​​​

6.3 线上高保链路

如果有的服务是需要保证高可用,为了避免被突发大流量打垮,也可以配置限流规则,保证整个请求链路上的流量可控。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值