精华内容
下载资源
问答
  • 限流算法的原理

    2020-08-24 19:42:47
    在一定时间间隔内,若计数器数字超限,则进行限流。 该算法的问题是,在两端临界点附加可能出现两倍的流速。 滑动窗口算法 基于计数器算法那,把时间间隔分片。例如服务限流每秒处理100个请求,把1秒分为10个窗口。...

    计数器算法

    在一定时间内,对处理的请求数进行计数,每次到达时间临界点则计数器清零。在一定时间间隔内,若计数器数字超限,则进行限流。
    在这里插入图片描述
    该算法的问题是,在两端临界点附加可能出现两倍的流速。

    滑动窗口算法

    基于计数器算法那,把时间间隔分片。例如服务限流每秒处理10000个请求,把1秒分为10个窗口。每100毫秒移动一次,内存中保留每次的请求次数。每次移动判断一下总次数是否超出10000限制。

    当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。
    在这里插入图片描述
    滑动窗口算法可以有效规避计数器算法中时间临界点问题。但实现起来相对比较复杂。

    Hystrix的限流基于滑动窗口算法实现。

    令牌桶算法

    系统已一个恒定的速率往桶放入令牌。若有请求需要处理,则从令牌桶里获取令牌,当桶里没有令牌,则拒绝服务。
    在这里插入图片描述
    令牌桶算法并不能实际的控制速率。比如,10秒往桶里放入10000个令牌桶,即10秒内只能处理10000个请求,那么qps就是1000。但这种模型可以出现1秒内把10000个令牌全部消费完,即qps为10000。所以令牌桶算法实际是限制的平均流速。具体控制的粒度以放令牌的间隔和每次的量来决定。若想要把流速控制的更加稳定,就要缩短间隔时间。

    Google Guava中的RateLimter就是利用的令牌桶原理。

    漏桶算法

    水滴先进入漏桶,漏桶以一定速度向外出水。当水流入速度过大,桶会直接溢出。

    即Request进入一个固定容量的Queue,若Queue满,则拒绝新的Request,可以阻塞,也可以抛异常。

    这种模型其实非常类似MQ的思想,利用漏桶削峰填谷,使得Queue的下游具有一个稳定流量。

    原文链接:https://www.cnblogs.com/shijiaqi1066/p/10508115.html

    展开全文
  • 限流算法介绍

    2019-07-25 22:37:36
    缓存:比如将热点数据缓存在 Redis、MemCache 这种高性能的内存型数据库中,能有效地削减直接请求数据库的次数,加快响应速度,降低数据库的压力 降级:服务降级是系统为了应对大量的请求,主动关闭部分功能,从而...

    前言

    高并发的处理有三个比较常用的手段:

    • 缓存:比如将热点数据缓存在 Redis、MemCache 这种高性能的内存型数据库中,能有效地削减直接请求数据库的次数,加快响应速度,降低数据库的压力
    • 降级:服务降级是系统为了应对大量的请求,主动关闭部分功能,从而保证核心功能可用。比如,在某宝双十一大促销的时候,用户是看不到一个月以前的历史订单的,这就是通过降级的手段,即暂时关闭了部分功能,来保证核心功能(就是下单、付款这些啊。。。)
    • 限流:如果一段时间内请求的数量过大,就会给服务器造成非常大的压力,可能导致服务器无法提供其它服务,限流就是通过限制系统的输入和输出流量,以达到保护系统的目的

    前几天经历了一场面试,临近末尾时面试官出了一道场景设计题,题目是这样的,假如说我们现在有一个服务,它要求一个用户一小时之内的访问次数不能超过 1000 次。如果你有了解过限流算法,那么相信你便能很快的拥有一个良好的解决思路。

    本文主要介绍四种限流算法,如下所示:

    • 计数器算法
    • 滑动窗口算法
    • 令牌桶算法
    • 漏桶算法

     

    一、计算器算法

    这个算法非常简单,就是使用一个计数器来统计一个时间段内请求的数量,并且在指定的时间后重置计数器,拿我文章一开头所提到的那个场景设计题来举例,如下图所示。

    在这里插入图片描述
    计数器可以使用 Redis 的 String 来实现,它支持整数与浮点数的自增操作,而且由于 Redis 是单线程模型的,不用考虑计数器的线程不安全问题。

    计算器算法原理易懂实现简单,但是有一个逃不开的问题,相信聪明的你也想到了,拿上面这张图来举例,如果某个用户在 8:00 ~ 8:55 这 55 分钟内,就访问了 1 次,而 8:55 ~ 9:00 这最后 5 分钟内却访问了 999 次,之后计数器在 9:00 即 9 点整的时候,重置为 0 了,之后这个用户在 9:00 ~ 9.05 这 5 分钟内又访问了 999 次,那么,这个用户实际上在 8:55 ~ 9:05 这短短的 10 分钟内访问了近 2000 次,这已经不符合我们的要求了,所以计数器算法无法限制窗口间的突发流量,这种临界问题就是计数器算法的一大弊病。

     

    二、滑动窗口算法

    它是对计数器算法的一种改进,将原来的一个时间窗口划分成了多个时间窗口,并且不断向右滑动该窗口。

    还是拿我一开始举的场景设计题举例,我们将一个小时的一整个时间窗口划分成六个十分钟的时间窗口,而且每个时间窗口都维护一个计数器,只要规定时间(一小时)的总窗口包括的所有格子的计数器(六个)总和超过了限流上限,便会执行限流措施,如下图所示。

    在这里插入图片描述
    那又过了 5 分钟,此时当前时间便位于 9:00 ~ 9:10 这个时间窗口内了,那么我需要滑动窗口,丢弃最后一个计数器(8:00 ~ 8:10 时间窗口的)。如下图所示

    在这里插入图片描述
    那么到这里,我们就能看出来,计数器算法的临界问题得到了解决,因为只要 8:50 ~ 9:00 这个时间窗口还在整个窗口中,用户就几乎没法再进行访问。

     

    三、漏桶算法

    漏桶算法这个名字很形象,算法内部有一个容器,类似生活用到的漏斗,当请求进来时,相当于水倒入漏斗,然后从下端小口慢慢匀速的流出。不管上面流量多大,下面流出的速度始终保持不变。

    不管服务调用方多么不稳定,通过漏桶算法进行限流,比如,每 10 毫秒处理一次请求。所以处理的速度是固定的。请求进来的速度是未知的,可能突然进来很多请求,没来得及处理的请求就先放在桶里,既然是个桶,肯定是有容量上限,如果桶满了,那么新进来的请求就丢弃。
    在这里插入图片描述
     

    四、令牌桶算法

    从某种意义上讲,令牌桶算法是对漏桶算法的一种改进,漏桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。

    在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。

    放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌,所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置 QPS 为100,那么限流器初始化完成一秒后,桶中就已经有 100 个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的 100 个请求!

    所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行。
    在这里插入图片描述

    展开全文
  • 比如累积一些数据批量写入,内存里面的缓存队列(生产消费),以及HBase写数据的机制等等也都是通过缓存提升系统的吞吐量或者实现系统的保护措施。甚至消息中间件,你也可以认为是一种分布式的数据缓存。降级服务...

    在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。本文结合作者的一些经验介绍限流的相关概念、算法和常规的实现方式。
    缓存
    缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升系统访问速度、提高并发访问量,也是保护数据库、保护系统的有效方式。大型网站一般主要是“读”,缓存的使用很容易被想到。在大型“写”系统中,缓存也常常扮演者非常重要的角色。比如累积一些数据批量写入,内存里面的缓存队列(生产消费),以及HBase写数据的机制等等也都是通过缓存提升系统的吞吐量或者实现系统的保护措施。甚至消息中间件,你也可以认为是一种分布式的数据缓存。
    降级
    服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。降级往往会指定不同的级别,面临不同的异常等级执行不同的处理。根据服务方式:可以拒接服务,可以延迟服务,也有时候可以随机服务。根据服务范围:可以砍掉某个功能,也可以砍掉某些模块。总之服务降级需要根据不同的业务需求采用不同的降级策略。主要的目的就是服务虽然有损但是总比没有好。
    限流

    流就是限制流量,就像你移动包了1个G的流量套餐,用完了就没了。限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。

    限流的算法
    常见的限流算法有:计数器、滑动时间窗口、漏桶和令牌桶算法。
    计数器法

    计数器法是限流算法里最简单也是最容易实现的一种算法。比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。那么我们可以这么做:在一开始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个 请求的间隔时间还在1分钟之内,那么说明请求数过多;如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置 counter,具体算法的示意图如下

    <?php
    
    class CounterDemo
    {
    
        private $timeStamp;
        public $reqCount = 0;
        public $limit = 100; //时间窗口内最大请求数
        public $interval = 1000; //时间窗口 ms
    
    
        public function __construct() {
            $this->timeStamp = time();
        }
    
        public function grant() {
            $now = time();
            if ($now < $this->timeStamp + $this->interval) {
                //时间窗口内
                $this->reqCount++;
                return $this->reqCount <= $this->limit;
            } else {
                // 超时后重置
                $this->timeStamp = time();
                $this->reqCount = 1;
                return true;
            }
        }
    }
    从上图中我们可以看到,假设有一个恶意用户,他在0:59时,瞬间发送了100个请求,并且1:00又瞬间发送了100个请求,那么其实这个用户在 1秒里面,瞬间发送了200个请求。我们刚才规定的是1分钟最多100个请求,也就是每秒钟最多1.7个请求,用户通过在时间窗口的重置节点处突发请求, 可以瞬间超过我们的速率限制。用户有可能通过算法的这个漏洞,瞬间压垮我们的应用。

    聪明的朋友可能已经看出来了,刚才的问题其实是因为我们统计的精度太低。那么如何很好地处理这个问题呢?或者说,如何将临界问题的影响降低呢?我们可以看下面的滑动窗口算法

    <?php
    
    class LeakyDemo
    {
    
        private $timeStamp;
        public $capacity; // 桶的容量
        public $rate; // 水漏出的速度
        public $water; // 当前水量(当前累积请求数)
    
    
        public function __construct() {
            $this->timeStamp = time();
        }
    
        public function grant() {
            $now = time();
            $this->water = max(0, $this->water - ($now - $this->timeStamp) * $this->rate); // 先执行漏水,计算剩余水量
            $this->timeStamp = $now;
            if (($this->water + 1) < $this->capacity) {
                // 尝试加水,并且水还未满
                $this->water += 1;
                return true;
            } else {
                // 水满,拒绝加水
                return false;
            }
    
        }
    
    }

    令牌桶算法图中我们可以看到,令牌桶算法比漏桶算法稍显复杂。首先,我们有一个固定容量的桶,桶里存放着令牌(token)。桶一开始是空的,token以 一个固定的速率r往桶里填充,直到达到桶的容量,多余的令牌将会被丢弃。每当一个请求过来时,就会尝试从桶里移除一个令牌,如果没有令牌的话,请求无法通过。

    具体的伪代码实现如下:
    <?php
    
    class TokenBucketDemo
    {
        private $timeStamp;
        public $capacity; // 桶的容量
        public $rate; // 令牌放入的速度
        public $tokens; // 当前令牌的数量
    
    
        public function __construct() {
            $this->timeStamp = time();
        }
    
        public function grant() {
            $now = time();
            $this->tokens = min(0, $this->tokens + ($now - $this->timeStamp) * $this->rate); // 先执行漏水,计算剩余水量
            $this->timeStamp = $now;
            if ($this->tokens < 1) {
                // 若不到1个令牌,则拒绝
                return false;
            } else {
                // 还有令牌,领取令牌
                $this->tokens -= 1;
                return true;
            }
        }
    }
    漏桶算法 VS 令牌桶算法
    漏桶算法和令牌桶算法最明显的区别是令牌桶算法允许流量一定程度的突发。因为默认的令牌桶算法,取走token是不需要耗费时间的,也就是说,假设桶内有100个token时,那么可以瞬间允许100个请求通过。令牌桶算法由于实现简单,且允许某些流量的突发,对用户友好,所以被业界采用地较多。当然我们需要具体情况具体分析,只有最合适的算法,没有最优的算法。
    展开全文
  • 限流

    2018-09-27 00:52:47
    限流算法: 计数器算法 问题:时间临界点:在00:00:00:999这一瞬时进来了100个请求,然后在00:00:01:001这一瞬时又进来了100个请 滑动窗口算法 漏桶算法 通过出水的速率来控制处理的请求数 问题:出水的速率恒定,...

    #限流

    系统可用性杀手:
    大对象:内存
    流量:线程数、数据库连接数

    针对系统可用性杀手的解决方案:
    大对象:
    流量:缓存、降级、限流、隔离


    限流算法:
    计数器算法
    问题:时间临界点:在00:00:00:999这一瞬时进来了100个请求,然后在00:00:01:001这一瞬时又进来了100个请
    滑动窗口算法
    漏桶算法
    通过出水的速率来控制处理的请求数
    问题:出水的速率恒定,瞬间大流量时大量请求被拒绝
    令牌算法
    通过令牌的生产速率来控制处理的请求数
    实现:Guava RateLimiter


    隔离:
    线程隔离
    读写隔离


    tomcat层限流:
    实例内限流:
    分布式限流:

    nginx层限流:

    展开全文
  • 高并发系统有三把利器:缓存、降级和限流; 限流的目的是通过对并发访问/请求进行限速来保护系统,一旦达到...最简单粗暴的限流算法就是计数器法了,而比较常用的有漏桶算法和令牌桶算法; 1.1计数器 计数器法是限流
  • 服务器限流

    2020-07-28 15:20:58
    本文结合作者的一些经验介绍限流的相关概念、算法和常规的实现方式。 缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升系统访问速度、提高...
  • NGINX限流配置

    2019-09-29 03:24:55
    Nginx的限流模块,是基于漏桶算法实现的,在高并发的场景下非常实用,如下图: 1、配置参数 1)limit_req_zone定义在http块中,$binary_remote_addr 表示保存客户端IP地址的二进制形式。 2)Zone定义IP状态...
  • 基于内存(linkedlist为例)的限流 基于木桶算法限流 本次介绍,主要关注实现策略、控制粒度及时间窗口问题,示例代码中可能存在编码不规范的情况,请忽略 1. 基于数据库的统计进行限流  基于数据库的统计进行...
  • 算法训练 网络裸题

    千次阅读 多人点赞 2020-04-02 15:03:32
    蓝桥杯算法训练 网络裸题ALGO-247 2020-03-27 我们先看题 试题 算法训练 网络裸题 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述  一个有向图,求1到N的最大 输入格式  第一行N M,表示点数与边数  ...
  • 我们常见的限流手段2.1 信号量计数2.2 线程池隔离2.3 固定窗口计数2.4 自然窗口计数2.5 滑动窗口计数2.5.1 基于共享分布式内存2.5.2 基于本地内存2.6 令牌桶和漏桶算法计数3. 微服务限流几个考虑的点3.1 机器时钟不...
  • 限流 一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如...限流算法 令牌桶算法 令牌桶算法,是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌: 假设限制2r/s
  • #1369 : 网络一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤。 小Ho...
  • 限流的几种实现

    2021-02-02 19:22:04
    算法 流量限制 ...消耗更多内存CPU统计并计算限流。 漏桶 缓冲区缓存,系统恒定速率处理请求。 特点: 消费匀速。 请求可能有一定的等待延迟。 突发流量会等待较久或者丢弃。 令牌桶 改进漏桶。某
  • nginx通过IP实现限流

    2020-09-02 21:18:41
    limit_req_zone用来限制单位时间内的请求数,即速率限制,采用的漏桶算法 "leaky bucket"。 limit_req 配合limit_req_zone 使用 示例 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; 第1...
  • 复杂事件处理是RFID数据管理的关键技术,由于受到内存的限制,海量实时的RFID原始数据处理 的中间结果部分只能存储在外存中,会产生内存瓶颈,严重限制了大规模RFID的部署。为此,提出了B -树 分时优化索引(BIOT...
  • Nginx的限流模块,是基于漏桶算法实现的,在高并发的场景下非常实用。 1)limit_req_zone定义在http块中,$binary_remote_addr 表示保存客户端IP地址的二进制形式。 2)Zone定义IP状态及URL访问频率的共享内存区域...
  • 网络一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤。 小Ho...
  • 题目1 : 网络一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤。 小Ho:...
  • 728. [网络24题] 最小路径覆盖问题 ★★★☆ 输入文件:path3.in 输出文件:path3.out评测插件时间限制:1 s 内存限制:128 MB 算法实现题8-3 最小路径覆盖问题(习题8-13) ´问题描述: 给定有向图G=(V,E)...
  • 题目链接点这里题目1 : 网络一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤。...
  • 时间限制:10000ms单点时限:1000ms内存限制:256MB描述小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤。小Ho:每到周末回家感觉堵车都是一种煎熬啊。小Hi:平时交通也...
  • 内存限制:256MB 描述 小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤。 小Ho:每到周末回家感觉堵车都是一种煎熬啊。 小Hi:平时交通也还好,只是...
  • 内存限制:256MB 描述 小Hi和小Ho住在P市,P市是一个很大很大的城市,所以也面临着一个大城市都会遇到的问题:交通拥挤。 小Ho:每到周末回家感觉堵车都是一种煎熬啊。 小Hi:平时交通也还好,只是一...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 255
精华内容 102
关键字:

内存限流算法