限流是通过限制访问数量,防止系统压力过大而崩溃,是保障系统稳定性的一道屏障 例如网站计划做促销活动
活动前会预估访问量,然后进行压力测试和预演,如果现在的性能无法满足,那么就需要通过优化或者扩容来达成目标
活动开始后,如果实际情况超过了预估值,通常会使用服务降级等方式来降低压力,如果还是不行,就要限流了,放弃一部分用户的访问,来保证系统整体的稳定 具体如何限流呢?之前看过淘宝工程师龙隆介绍的策略,思路很简洁,因为我的系统访问量比较平稳,没有做限流的处理,就没做相关测试,下面把龙隆的方法整理出来,来给自己和有需要的朋友开扩思路
限流思路
先定义上限数量,当系统接收到请求时,判断现有的请求数量是否已经超过限值,如果是,直接返回,不处理此请求,如果否,处理此请求,并给此请求计数,当这个请求处理完成后,释放此请求的计数 用java实现很简单,java中有Semaphore信号量的概念 示例代码 //定义信号量 Semaphore semaphore = new Semaphore(100); //当请求数量超出时,直接返回 if(semaphore.getQueueLength() > 0){ return; } try{
//申请获得信号量资源 semaphore.acquire(); ... //处理业务逻辑 } catch(...){ ... } finally{ //释放 semaphore.release(); } 上面初始化时定义了100个资源数量,每来一个请求就计数,当同时处理的请求数量达到了100,那么第101个请求就进入等待队列,不再进行处理了