共计 1497 个字符,预计需要花费 4 分钟才能阅读完成。
封面图
嗨~ 大家好啊,我是阿壮,一个有情怀的程序员。面试中常常会问到限流的办法有哪些,我整顿了常见的限流算法如下
- 固定窗口限流算法
- 滑动窗口限流算法
- 漏桶算法
- 令牌桶算法
限流是什么?
限流顾名思义就是限流流量,也叫流量管制,在零碎面临高并发、大流量申请的状况下,限度新的流量对系统的拜访,从而保证系统服务的安全性。举个例子,一个电影院只有 200 个座位,并发售 200 张门票,每个门票代表一个人,代表这个电影院只能够进入 200 人,多余的人就买不到票也就进不了电影院。
为什么要实现限流
限流起到保证系统稳固的作用。如果一个零碎不限度流量,如果有大量的流量指向零碎,比方在秒杀流动、双十一促销等场景下,点击量剧增,用户的流量巨增,然而服务的解决能力是无限的,如果不能解决好大流量申请,零碎很容易产生瘫痪。
固定窗口限流算法
固定窗口限流算法又称计数器算法(Fixed Window),通过在单位工夫内保护的计数器来管制该工夫单位内的最大访问量。
设置没小时不超过 3 个申请,超出阈值则拒绝请求,未超出阈值则承受申请并将计数器加 1,当工夫窗口完结时,重置计数器为 0。
长处
实现简略,容易了解。
毛病
- 一段时间内服务不可用。
比方 10s 内限流 100 此申请,然而 0s-1s 就来了 100 个申请,则 2s-10s 的申请都是被回绝的。
- 窗口切换时可能会呈现两倍阈值的申请。
比方 10s 内限流 100 此申请。0s-9.99s 没有申请,而在 9.99s-10s 之间来了 100 个申请,当切换到下一个窗口时,在 0s-0.01s 之间来了 100 个申请,而咱们的阈值设置的是每 10s100 次申请,通过的申请达到了阈值的两倍
滑动窗口限流算法
滑动窗口限流算法是固定窗口限流算法的改良,补救了固定窗口限流算法可能会呈现两倍阈值申请的毛病。为了避免刹时流量,能够把固定窗口近一步划分成多个格子,每次向后挪动一小格,而不是固定窗口大小。
在滑动窗口的状况加就不存在窗口切换导致申请达到阈值两倍的状况,因为它基本不会切换窗口,每次都是往后挪动一格,如图所示,假如 1s 内只承受 100 个申请,在绿色地位承受了 100 个申请,当到了黄色地位,应为在窗口内绿色曾经达到了 100 个申请的阈值,所以在黄色地位就不会再承受申请。
特点
- 补救了固定窗口限流算法的毛病即防止了固定窗口算法在窗口切换时可能会产生两倍于阈值流量申请的问题。
- 和漏桶算法相比,新来的申请也可能被解决到,防止了漏桶算法的饥饿问题。
漏桶算法
举个例子,如果有一个桶,桶上面有一个小洞,每秒以固定的速率在滴水,当注入的水超过桶的容量时就会溢出。这里的滴水就代表咱们解决的申请,注水就代表用户流量,桶就代表咱们存储的申请,溢出就代表被抛弃的申请。在零碎看来,申请永远是以平滑的传输速率过去,从而起到了爱护零碎的作用。漏桶算法实现能够借助队列来实现,队列中存储咱们须要解决的申请即可。
特点
- 漏桶的漏出速率是固定的,能够起到整流的作用。
- 不能解决流量突发的问题。
假如桶的容量是 5,“漏”的速度是 2 个 /s,当忽然有 10 个申请时,首先抛弃 5 一个申请,还有 5 个申请放到桶中,而这 5 个申请还只是放在桶中在期待解决,所以并没有解决流量突发的问题。
令牌桶算法
令牌桶算法是为了解决漏桶算法的毛病 (不能解决流量突发)。
如图所示,以恒定的速度往桶中生成令牌,如果桶满了那就抛弃,每当来一个申请,就从桶中拿走一个令牌,如果桶中没有令牌即申请没有拿到令牌,则回绝这个申请。所以令牌桶算法和漏桶算法的区别就是容许肯定水平的流量突发。
特点
除了可能在限度调用的均匀速率的同时还容许肯定水平的流量突发。
我是阿壮,一个有情怀的程序员,微信搜一搜:科技猫,获取第一工夫更新,咱们下期见