限流算法:
1、漏桶算法:①流入水滴流入速率任意;②如果流入速率过快,超过了桶的容量,则直接丢弃水滴;③按照常量速率留出水滴;
2、令牌桶算法:①按照100毫秒固定速率填充令牌,填满了则丢弃令牌;②请求;③获取令牌;④处理请求;⑤令牌不足则拒绝请求;
如:springboot项目中,通过采用谷歌开发包下的ratelimiter方法去限流,可注解的形式和spring的切面编程方式去实现对controller层的请求过滤限流拦截,仅实现单节点。
不同点:
1、令牌桶允许一定程度的突发,而漏桶主要目的是平滑流入速率;
2、两个算法实现可以一样,但是方向是相反的,对于相同的参数得到的限流效果是一样的。
计数器来限流,限制总并发数,例如:数据库连接池大小、线程池大小、秒杀并发数计数器的用法。只要全局总请求数或者一定时间段总请求数达到设定阈值,则进行限流。
应用级限流:
为了限制TPS/QPS,比如设置acceptCount(允许的进入队列的数量);maxConnections(最大的连接);maxThread最大的线程数。
其中mysql和redis都可以设置限制连接数的配置。
限流某个接口总并发数/请求数:
java中的AtomicLong或者Semaphore进行限流;Guava的cache来存储计数器,过期时间设置为2秒(保证能记录1秒内的计划数)。然后,我们获取当前时间戳,取秒数来作key进行计数统计和限流。
Guava RateLimiter提供的令牌桶算法可用于平滑突发限流和平滑预热限流实现。
guava提供了三种缓存回收的策略:基于容量回收、定时回收和基于引用回收。
分布式限流:
redis+lua或Nginx+lua
通过消息队列
网友评论