限流

作者: 夜雨听风_b3d5 | 来源:发表于2019-10-27 17:18 被阅读0次

    限流算法:

    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

    通过消息队列

    相关文章

      网友评论

          本文标题:限流

          本文链接:https://www.haomeiwen.com/subject/lnxmvctx.html