1、代理层限流 代表作:nginx

Nginx 常用于服务器反向代理,达到实现负载均衡和保护后端的应用服务器的目的。Nginx 主要通过限制访问频率和并发连接数两种方式达到限制目的,Nginx 配置文件支持丰富的配置命令,比如下面一种配置示例

imit_conn 可以对指定的 IP 甚至是所在服务主机限制并发连接数量。

limit_req_zone 的命令含义是对限制的对象(如 URL 地址、服务器地址和客户端 IP 地址等)设置最大访问速率,zone 部分定义了共享内存区的名称和大小。

2、容器限流

前端请求经过代理转发到后端 Web 容器比如 Tomcat 之后,我们可以通过自定义线程池,配置最大连接数,请求处理队列等参数来达到限流的目的。

这里配置了一个在 8080 端口监听的 Connector,并且配置了处理请求能支持的最大和最小线程数量分别为 500 和 100,通过 acceptCount 指定当请求达到最大线程使用上限时候,能够进入队列排队的请求数量

3、api限流

a、时间窗口

基于时间窗口限流的方式有两种,分别是固定时间窗口和滑动时间窗口,固定时间窗口可以看做滑动窗口的一个特列。

 

 

b、滑动窗口

为了解决固定窗口算法的临界问题,我们将其升级为滑动窗口算法。滑动窗口算法实现借鉴滑动窗口协议,将单位时间继续细化为更小粒度的时间网格,每当用户请求,时间网格随之推移,计数器的的统计时间区间也随之变动。滑动窗口算法的单位时间不再是彼此独立,而是步步递进,彼此重叠。这也是滑动窗口算法跟固定窗口算法最大的区别。

由于滑动窗口算法每次都需要统计单位时间的请求量,开销远大于固定窗口算法,所以在真实的业务环境中需要慎重使用滑动窗口算法。

对比如下:

 

3、漏桶算法

水滴(用户请求)优先注入到桶中(定长队列、先进先出队列),桶(队列)盛满后自动抛弃(限流)多余的水(请求),另外桶以匀速的方式漏出水滴(处理请求)

不适合现实业务合法的突发流量场景

4、令牌算法

漏桶队列+事件调度器;令牌桶算法的2部分业务逻辑为:令牌生产+令牌消费。漏桶算法是以固定的速率处理用户请求(消费),而令牌桶算法则以固定的速率生产令牌(生产)。

其中需要重点关注的是:1、一个令牌不可被2个请求获取(需要加锁,并置为不可用状态);2、在请求处理完毕后需销毁令牌。

guava限流器 RateLimiter是基于令牌桶算法实现的一个多线程限流器,它可以将请求均匀的进行处理,当然他并不是一个分布式限流器,只是对单机进行限流。它可以应用在定时拉取接口数据,

预防单机过大流量使用。

黑色不知勤学早,白发方悔读书迟!行动起来,每天进步一点点!