开放平台的请求限流方案
场景
在设计开放性平台系统(尤其OpenAPI类型平台)时有三把利器用来保护系统:缓存、降级和限流。
●缓存:提升系统访问速度和增大系统能处理的容量,抗高并发流量;
●降级:当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解
决后再打开;
●限流:有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如
评论、下单)、频繁的复杂查询(评论的最后几页)、恶意爬虫攻击,因此需有一种手段来限制这些场景的并发/请求量,即限流。
目的
限流的目的是通过对并发连接/访问请求进行限量,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制阈值或速率则可以拒绝服务(返回HTTP状态码、重定向到错误页或告知资源没有了)、排队
或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货)。
限流策略
1.IP
针对调用方IP进行限制,黑白名单、请求速率、带宽流量
2.End Point
系统平台开放的url、接口地址、服务域名等都可视为一个限流端点(End Point)对其进行不同粒度限制
3.User Token
使用用户唯一标识限制用户级别的调用,常用唯一标识:
●Cookies\SessionId\Token:会话唯一标识
●UserId:用户唯一标识
●DeviceId:用户设备号
4.客户端Key
使用调用方客户端的唯一标识,对第三方调用进行限制,常用标识:
●AppId:第三方唯一ID
●Header\User-agent
●App Domain:第三方域名
●APP Name:第三方服务名
流控方式
1.针对资源的限制
●总并发数:Web容器并发连接数、数据库连接池、应用线程池、文件句柄
●瞬时并发数:Web服务器Http连接数,socket连接数等
●CPU\内存负载情况
●网络带宽流量情况
2.针对频率的限制
●时间窗口请求速率:一定时间窗口期内的request请求速率(QPS\TPS)
●RPC调用速率
●MQ生产消费速率
总体概览
限流算法
1.计数器
简单直接,配合redis等缓存原子操作实现
2.漏桶
漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率.示意图如下:
可见这里有两个变量,一个是桶的大小,支持流量突发增多时可以存多少的水(burst),另一个是水桶漏洞的大小(rate),在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使某一个单独的流突发到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法可以结合起来为网络流量提供更大的控制。
3.令牌桶
令牌桶算法(Token Bucket)和Leaky Bucket 效果一样但方向相反的算法,更加容易理解.
随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了.新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务.
令牌桶的另外一个好处是可以方便的改变速度. 一旦需要提高速率,则按需提高放入桶中的令牌的速率. 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量.
限流技术
常用限流技术可针对其作用的位置分为如下几个层级:
代理层
基于网络的接入入口层的流量整形(T raffic shaping)策略进行控制,针对使用的负载均衡策略可分为:
Nginx:使用软负载,可利用Nginx自带的模块
连接限制,可对某个KEY对应的总的网络连接数
进行限流,可以按照如IP、域名维度进行限流
request请求限制,可对某个KEY对应的请求的平均速率进行限流
●Nginx + lua:基于Nginx lua模块或直接使用
Nginx-Lua-API:github/openresty/lua-nginx-module#nginx-api-for-lua
●HAproxy:github/dschneller/haproxy-http-based-rate-limiting
●硬件负载均衡器(A10\F5):略
API层
应用业务逻辑加入Rate limit控制逻辑,实现方式可结合如下框架:
●Redis:计数器
●Google- Guava:google令牌桶算法开源框架,提供了限流工具类RateLimiter
●Gateway模式
线程层
线程级别对请求控制:
●线程池
●熔断器
●舱壁隔离技术
●信号量隔离技术
●降级方案负载均衡器的作用
限流粒度
根据上文提到的限流策略,可将限流的粒度级别由粗到细做如下划分:
●IP级:针对调用方IP限制
●应用级:针对调用方(第三方)域名、租户级(AppId)
●业务级:针对用户、应用服务url、开放接口方法地址
由上向下粒度范围逐级变小,限制更精确
限流方案
本文针对作用在代理层的限流控制,提供一套完整开放性平台限流技术解决方案。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。