限流

限流在分布式和微服务系统中非常常用的设计思想,在出现流量洪峰或者恶意攻击时,限流能够保护系统的服务能够正常运行。

 

 

限流策略

   1.拒绝服务:把多出来的请求拒绝掉

   2.服务降级:关闭或把后端做降级处理,释放资源给主流程服务

   3.优先级请求:将目前系统的资源分配给优先级更高的用户,优先处理权限更高的用户请求

   4.延时处理:一般来说会使用缓冲队列来缓冲大量的请求,系统根据自身负载能力异步消费队列中的请求

   5.弹性伸缩:采用自动化运维的方式对相应的服务做自动化伸缩

 

常用的限流算法

   常见的限流算法有:漏桶、令牌桶。计数器也可以用来进行粗暴限流实现。

 

1.漏桶算法:

   漏桶算法的基本思想是:利用一个缓冲区,当有请求进入系统时,无论请求的速率如何,都先在缓存区内保存,然后以固定的流速流出缓冲区进行处理。

   它的主要目的是控制数据进入系统的速率,平滑应对系统的突发流量,为系统提供一个稳定的请求流量。

限流常用的策略及算法

 

2.令牌桶算法:

 令牌桶算法是一种反向的漏桶算法。在令牌桶算法中,桶中存放的不再是请求,而是令牌。处理程序只有拿到令牌后,才能对请求进行处理。如果没有令牌,那么处理程序要么丢弃请求,要么等待可用的令牌。为了限制流速,该算法在单个时间单位产生一定量的令牌存入桶中。

限流常用的策略及算法

 

常用实现:

Java版本:google提供的Guava核心库中的RateLimiter类就是基于令牌桶实现的流控

Golang : Golang的golang.org/x/time/rate也是基于令牌桶实现的限流

 

 

3.计数器算法:

   给出一个单位时间,然后使用一个计数器counter统计单位时间内收到的请求数量,当请求数量超过门限时,其余的请求丢弃或者等待。

    这种算法简单粗暴,但是很难控制边界时间请求。

 

 

限流框架

限流框架可以使用阿里开源的Sentinel

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。目前(2020年)已经支持Java、C++、Go版本。

  

 

相关文章: