为什么要接口限流
防止用户恶意刷新接口, 防止对接口的恶意请求,减少不必要的资源浪费,从而保证服务可用。如果不做限流,任由某个用户以非正常方式高频率访问的话,会直接将网络流量、服务器资源挤占完,从而影响正常对外提供服务,造成服务不可用。
常见的解决方案
1.计数器法
使用redis或者其他方式存储单位时间内某个接口的或者IP的请求数量,当累加到最大数量时,返回错误,不再处理该请求。
该方案的缺点是,比如需求是5秒内只允许访问10次,那么如果第一秒内访问了10次,那么后面4秒的请求都会失败,全部被拒绝。
2.漏桶算法
漏桶算法是,将用户的请求当做水流,当用户请求进来的时候,相当于将水放到一个漏水的桶内,桶有自己漏水的速度,无论水流的大小,水流过大时,如果桶满了,就会被拒绝,返回错误。如果桶还没满,就放到桶里,等待执行。相当于有个缓冲,无论请求量大小,最后都会按照一定的速率执行。
该方案的缺点是,如果短时间内有大量请求进来,比如秒杀活动什么的,桶直接就满了,大量请求失败
3.令牌桶算法
令牌桶算法是漏桶算法的升级版,相对于漏桶算法而言,漏桶算法后台处理请求的速率是固定的,比如一秒处理十个请求;而令牌桶算法是有一个令牌桶,以一定的速率往桶里放令牌,和滴水一样,当桶满了令牌会被丢弃,只有拿到令牌的请求才会被处理,当桶里没有令牌时,会进行等待,当超过了超时时间还没拿到令牌时,请求会被拒绝。
该方案的优点是,可以应对短时大量请求。假如令牌桶的大小是100,放令牌的速率是1秒5个,前20秒没有请求,21秒来了100个请求,那么这100个请求都会被直接处理。22秒再来100个请求,等待时间是1秒,就只有5个请求会成功了,其余的拿不到令牌等待,再过1秒后,又有5个成功,其余90个被拒绝。