zoukankan      html  css  js  c++  java
  • 限流(一)限流算法

    在高并发系统中,我们常常提到的几个词汇“缓存”,“限流”,“降级”等。本文涉及到的是其中“限流”的部分,顾名思义,限流是一种限制流量的手段(我们可以粗粒度地理解为,限制请求的数量或者速度)。

    在限流特技中,常见的限流算法有两种:

    1)令牌桶算法;

    2)漏桶算法;

    当然,我们也可以粗暴地采用计数器的方式来进行限流。

    一、令牌桶算法

    如图所示:

    1、桶里每秒钟会产生十个令牌,当然令牌总数不能超过桶的最大容量。

      1)令牌产生的速度是均匀的,也就是说系统能够接收的请求是均匀的,比如每秒钟接收10个请求。

      2)令牌桶表示请求的容纳范围,比如0 - 100个请求。

    2、发起一个请求,如果桶里面有足够的令牌,那么该请求就能够被处理(同时删除桶里面的一个令牌),否则被丢弃或者缓存。

      1)令牌产生的速度是均匀的,所以接收的请求是均匀的,但是被处理的请求却不一定均匀。比如,令牌桶里面有60个令牌,当前这秒钟有60个请求进来,这时候就会瞬间要处理60个请求。而不是每秒10个请求,所以令牌桶算法是允许瞬间爆发的请求数量的。

      2)也就是说,只要令牌桶里面有足够的令牌,那么请求都能够被处理,令牌桶算法只是限制了请求的接收而不是请求的处理

    二、漏桶算法

    如图:

    1、任意数量的请求被发起,进入容器里面,当然依然不能超过容器的最大值(比如:100个请求);

      1)这里表示,接收请求除了容器最大值,是没有速度限制的。

    2、而容器里面的请求则是按照固定的速度均匀的被处理(比如每秒处理10个请求);

    三、令牌桶和漏桶算法的区别

    1、最重要的点在于,令牌桶限制的是流入(接收请求)漏桶限制的是流出(处理请求)。

    2、由于漏桶限制的是流出,所以相对令牌桶来说平滑了流入的速率。

    3、令牌桶算法允许瞬间爆发,而漏桶算法处理请求的速度永远是一致的。

    4、两种算法只是实现方案不同,如果参数相同的话,最终限流效果是一样的

    四、计数器限流

    除了以上两种限速的算法,其实还可以简单地采用计数器来限数

    只要请求数量达到最大值,那么就丢弃或者缓存。

    计数器限流的方式比较粗暴,因为它不限制流入速度,也不限制流出速度。所以只要未达到最大值它就会接收并处理请求,因此,如果并发情况下,它可能导致系统一定时间段内维持在峰值上,影响响应速度。不过这种处理方式比较简单,只需要控制总请求数量或者单位时间的请求数量即可。

    参考:

    http://jinnianshilongnian.iteye.com/blog/2305117

  • 相关阅读:
    第一天
    python自测——其他内容
    python自测——正则表达式
    python自测——高级特性
    人机对战石头剪刀布代码
    [Usaco2004 Nov]Til the Cows Come Home 带奶牛回家
    Dijkstra概念
    洛谷p1339--热浪
    0-1背包问题变形------------cow exhibition
    [Poi2005]Piggy Banks小猪存钱罐
  • 原文地址:https://www.cnblogs.com/lay2017/p/9060497.html
Copyright © 2011-2022 走看看