限流的作用相当于电路上的保险丝,当过载的时候掐掉一些流量, 让系统有能力集中资源以较快的速度处理我们的应用处理能力范围内的业务请求。比如仅让1000万用户中的100万用户进人后端的处理流程中,将其余900万用户的请求通过队列排队或直接阻挡在平台处理单元之外的方式,保障平台能在处理能力范围内对100万的用户请求进行处理。
平台要具备限流的能力,首先要对应用的能力有一个准确的评估, 知道服务实例的部署到底最大能满足多少业务请求的处理要求。这就需要采用压力测试的方式对系统进行压测。
在掌握服务的容量后,接下来就是要针对服务资源的使用情况进行监控,通过资源监控的指标与之前所获取的处理上限进行比较,如果超过服务处理上限则启动限流。通过CPU、内存、磁盘IO等资源的使用情况来判断系统目前的负载往往是不准确的,因为很多情况下系统本身的处理能力处于什么样的水位跟这些操作系统资源的使用情况没有一个清晰地对应关系,所以在实际中,都会通过服务的QPS作为限流的关键判断指标。
对于限流的实现,先从一个应用架构的角度来看。用户的请求首先会通过前端接入层(一般采用Nginx)分发到后端的应用集群上,应用集群中主要负责用户的前端交互。为了避免远超过系统处理负载上限的访问请求,同时也能很好的兼顾安全问题,通过一些安全策略防止对平台的恶意攻击,所以最优的限流拦截点在前端接入层面。
开源模块nginx-htp-sysguard,主要用于当访问负载和内存达到一定的阀值之时,会执行相应的动作,比如直接返回503,504 或者其他URL请求返回代码,一直等到内存或者负载回到阀值的范里内,站点恢复可用。
更细粒度的控制,可以通过springAOP切面技术,配置拦截哪些url。