zoukankan      html  css  js  c++  java
  • 分布式限流 のRedis

    前言

    高并发开发系统时,常见的保护系统的方式是:缓存、降级、限流

    • 缓存:缓存的目的是提升系统访问速度和增大系统处理容量
    • 降级:降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行
    • 限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理

    名词解释

    • 单击限流
      • AtomicInteger、RateLimiter、Semaphore 等
    • 分布式限流
    • Redis
    • lua 脚本
    • 令牌桶 
      • 令牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下:

        • 假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌;

        • 桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝;

        • 当一个n个字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上;

        • 如果桶中的令牌不足n个,则不会删除令牌,且该数据包将被限流(要么丢弃,要么缓冲区等待)。

         
    • 漏桶
      • 漏桶作为计量工具(The Leaky Bucket Algorithm as a Meter)时,可以用于流量整形(Traffic Shaping)和流量控制(TrafficPolicing),漏桶算法的描述如下:
        • 一个固定容量的漏桶,按照常量固定速率流出水滴;

        • 如果桶是空的,则不需流出水滴;

        • 可以以任意速率流入水滴到漏桶;

        • 如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃),而漏桶容量是不变的。

    • 计数器

    令牌桶和漏桶对比:

    • 令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求;

    • 漏桶则是按照常量固定速率流出请求,流入请求速率任意,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝;

    • 令牌桶限制的是平均流入速率(允许突发请求,只要有令牌就可以处理,支持一次拿3个令牌,4个令牌),并允许一定程度突发流量;

    • 漏桶限制的是常量流出速率(即流出速率是一个固定常量值,比如都是1的速率流出,而不能一次是1,下次又是2),从而平滑突发流入速率;

    • 令牌桶允许一定程度的突发,而漏桶主要目的是平滑流入速率;

    • 两个算法实现可以一样,但是方向是相反的,对于相同的参数得到的限流效果是一样的

    各位看官大佬,不足之处,多多批评指正,不胜感激!
  • 相关阅读:
    java基础(十九)IO流(二)
    java基础(十八)IO流(一)
    java基础(十七)集合(四)
    java基础(十六)集合(三)
    java基础(十五)集合(二)
    java基础(十四)集合(一)
    oracle中trim,ltrim,rtrim函数用法
    最详细的Log4j使用教程
    SAP ERP和ORACLE ERP的区别是哪些?
    PLS-00221: 'function' 不是过程或尚未定义
  • 原文地址:https://www.cnblogs.com/guoguochong/p/14880307.html
Copyright © 2011-2022 走看看