常见的限流算法

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。

天下武学出同源

正所谓天下武学殊途同归,不管是Nginx限流还是Redis限流,也不管招式耍的再花哨,到了最后都是应用几种特定的限流算法。

常见的限流算法一只手都可以数的过来,今天我们挑选令牌桶算法漏桶算法、滑动窗口和计数器算法来讲一下。

令牌桶算法

Token Bucket令牌桶算法是目前应用最为广泛的限流算法,顾名思义,它有以下两个关键角色:

  1. 令牌 获取到令牌的Request才会被处理,其他Requests要 么排队要么被直接丢弃
  2. 用来装令牌的地方,所有Request都从这个桶里面获取令牌

了解了这两个角色之后,让我们来看-下令牌桶算法的图示:

下面我们分别从令牌生成和令牌获取两个流程来解读令牌桶算法:

令牌生成

这个流程涉及到令牌生成器和令牌桶,前面我们提到过令牌桶是一个装令牌的地方,既然是个桶那么必然有一个容量,也就是说令牌桶所能容纳的令牌数量是一个固定的数值。

对于令牌生成器来说,它会根据一个预定的速率向桶中添加令牌,比如我们可以配置让它以每秒100个请求的速率发放令牌,或者每分钟50个。注意这里的发放速度是匀速,也就是说这50个令牌并非是在每个时间窗口刚开始的时候一次性发放,而是会在这个时间窗口内匀速发放。

在令牌发放器就是一个水龙头,假如在下面接水的桶子满了,那么自然这个水(令牌)就流到了外面。在令牌发放过程中也一样,令牌桶的容量是有限的,如果当前已经放满了额定容量的令牌,那么新来的令牌就会被丢弃掉。

思考题:大家知道为什么要匀速发放吗?小伙伴们先自己思考一下。在这一章的最后一个小节里,我们再来探讨匀速限流和非匀速限流的区别,以及这里面可能会踩到的坑。

令牌获取

每个访问请求到来后,必须获取到一个令牌才能执行后面的逻辑。假如令牌的数量少,而访问请求较多的情况下,一部分 请求自然无法获取到令牌,那么这个时候我们可以设置-个“缓冲队列”来 暂存这些多余的令牌。

缓冲队列其实是-个可选的选项,并不是所有应用了令牌桶算法的程序都会实现队列。当有缓存队列存在的情况下,那些暂时没有获取到令牌的请求将被放到这个队列中排队,直到新的令牌产生后,再从队列头部拿出一个请求来匹配令牌。

当队列已满的情况下,这部分访问请求将被丢弃。在实际应用中我们还可以给这个队列加一系列的特效,比如设置队列中请求的存活时间,或者将队列改造为PriorityQueue, 根据某种优先级排序,而不是先进先出。算法是死的,人是活的,先进的生产力来自于不断的创造,在技术领域尤其如此。

漏桶算法

Leaky Bucket。瞧见没,又是个桶,限流算法是跟桶杠上了,那么漏桶和令牌桶有什么不同呢?我们来看图说话:

漏桶算法的前半段和令牌桶类似,但是操作的对象不同,令牌桶是将令牌放入桶里,而漏桶是将访问请求的数据包放到桶里。同样的是,如果桶满了,那么后面新来的数据包将被丢弃。

漏桶算法的后半程是有鲜明特色的,它永远只会以一个恒定的速率将数据包从桶内流出。打个比方,如果我设置了漏桶可以存放100个数据包,然后流出速度是1s一个,那么不管数据包以什么速率流入桶里,也不管桶里有多少数据包,漏桶能保证这些数据包永远以1s一个的恒定速度被处理。

漏桶vs令牌桶的区别

根据它们各自的特点不难看出来,这两种算法都有一个“恒定”的速率和“不定”的速率。令牌桶是以恒定速率创建令牌,但是访问请求获取令牌的速率“不定”,反正有多少令牌发多少,令牌没了就干等。而漏桶是以“恒定”的速率处理请求,但是这些请求流入桶的速率是“不定”的。

从这两个特点来说,漏桶的天然特性决定了它不会发生突发流量,就算每秒1000个请求到来,那么它对后台服务输出的访问速率永远恒定。而令牌桶则不同,其特性可以“预存”一定量的令牌,因此在应对突发流量的时候可以在短时间消耗所有令牌,其突发流量处理效率会比漏桶高,但是导向后台系统的压力也会相应增多。

滑动窗口

Rolling Window,穿上你的滑板鞋,跟我一起摇摆。

上图中黑色的大框就是时间窗口,我们设定窗口时间为5秒,它会随着时间推移向后滑动。我们将窗口内的时间划分为五个小格子,每个格子代表1秒钟,同时这个格子还包含一个计数器, 用来计算在当前时间内访问的请求数量。那么这个时间窗口内的总访问量就是所有格子计数器累加后的数值。

比如说,我们在每一秒内有5个用户访问,第5秒内有10个用户访问,那么在0到5秒这个时间窗口内访问量就是15。 如果我们的接口设置了时间窗口内访问上限是20,那么当时间到第六秒的时候,这个时间窗口内的计数总和就变成了10,因为1秒的格子已经退出了时间窗口,因此在第六秒内可以接收的访问量就是20-10=10个。

滑动窗口其实也是一种计算器算法,它有一个显著特点,当时间窗口的跨度越长时,限流效果就越平滑。打个比方,如果当前时间窗口只有两秒,而访问请求全部集中在第一秒的时候,当时间向后滑动一秒后,当前窗口的计数量将发生较大的变化,拉长时间窗口可以降低这种情况的发生概率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/322061.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用二维码介绍产品详情,扫码查看图文并茂的宣传册

传统的产品宣传方式,往往以产品手册、宣传单等纸质物料为主,更新成本高昂,一旦修改内容,就必须重新印刷,而且不易携带和保存,影响宣传效果和客户体验。 为了避免上述问题,可以在草料上搭建产品…

Python之循环判断语句

一、if判断语句 1. if...else if 条件: 满足条件时要做的事情1 满足条件时要做的事情2 ...... else: 不满足条件时要做的事情1 不满足条件时要做的事情2 ...... # -*- coding:utf-8 -*- age input("请输入年龄:") age int(age) if age > 18:print("已经成…

云贝教育 |【技术文章】存储对象的LIBRARY CACHE LOCK/PIN实验(一)

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 实验环境 操作系统:Red Hat Enterprise Linux release 8.8 (Ootpa) 数据库:oracle Version 19.3.0.0.0 …

Openstack云计算(六)Openstack环境对接ceph

一、实施步骤: (1)客户端也要有cent用户: useradd cent && echo "123" | passwd --stdin cent echo -e Defaults:cent !requiretty\ncent ALL (root) NOPASSWD:ALL | tee /etc/sudoers.d/ceph chmod 440 /et…

Endothelin-1(内皮素-1) ELISA kit

灵敏、快速的内皮素-1 ELISA试剂盒,适用于心血管和应激相关研究 内皮素(Endothelin, ET)是由血管内皮细胞产生的异肽,具有强大的血管收缩活性。这种肽由三个独立的基因编码,经过加工产生39个残基的 大ET 分子&#xff…

Linux的SSH远程管理和服务器之间的免密连接

目录 一、远程管理基础 1.ssh协议 2.ssh原理 3、使用ssh协议传输的命令 4.登录方法 二、免密连接 1.免密连接的原理 2.实战 一、远程管理基础 1.ssh协议 ssh协议是基于C/S机构的安全通道协议,通信数据进行加密处理,用于远程管理。 ssh的服务名…

Linux多网卡绑定实现负载均衡详解

将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址。 目录 1、bond的作用 2、Bonding聚合链路工作模…

低代码开发,企业的金钥匙,工业4.0转型的催化剂

近年,国内工业产值开始逐渐放缓,人口红利也开始逐渐消退,工业领域现在面临着高能耗、高投入、高风险以及低效益的困境。我国将“先进制造”作为十四五规划重要目标,推动工业领域实体经济、智能化转型、实现数字化、加快工业互联网…

PattPatel-“Introduction to Computing Systems“(3)期末样卷题目解析:C语言与汇编语言转化

上接(1)basic ideas和与解析(1) 核心思路还是借具体题目来理解书中的两条basic ideas——abstraction of layers与think both softwarely and hardwarely。 C语言与汇编语言的转化 题目的要求是将下面的这段代码用LC-3改写。 这…

SQL备忘--集合运算

前言 本文讨论的是两个子查询结果的合并问题, 是行维度下的合并处理 例如子查询A查出5条记录、子查询B查出3条记录,那么将两个结果合并,则共返回8条记录 行维度上要能进行合并,前置要求是:子查询的列字段是相同的&…

erlang/OTP 平台(学习笔记)(一)

OTP 我们在OPT概述里曾简单的了解过,现在让我们来进行进一步了解 理解并发和erlang的进程 1.理解并发 并发就是并行吗?不完全是,至少在讨论计算机和编程时二者并不等同。 有个常用的半正式定义是这么说的:“并发,用于形容那些无须以特定…

数据库——DAY1(Linux上安装MySQL8.0.35(网络仓库安装))

一、环境部署 1、Red Hat Enterprise Linux 9.3 64 位 2、删除之前安装过本地镜像版本的MySQL软件(以前未安装过,请跳过此步骤) [rootlocalhost ~]# dnf remove mysql-server -y [rootlocalhost ~]# rm -rf /var/lib/mysql [rootlocalhost …

十一、three场景实现太阳光晕

今天讲的太阳光不是three自带的DirectionalLight这个灯光,而是在场景里面能真实看到的光线特效,也可以叫做光晕。 先看实现效果图 现在讲讲实现步骤 安装maath,这是一个由数学助手、随机生成器、bits和bobs的集合。引入这个的目的是LensFlare.js文件要用这个来做太阳的旋转…

odoo 一日一技 odoo去除业务模块的基础框架

基础介绍​​​ 为了单纯使用odoo基础框架,我将源码整理成四个版本,分为社区版、企业版、社区基础版(去除非必要的业务模块)、企业基础版(去除非必要的业务模块)。如图还可以这样创建四个对应配置文件。 这边以社区基础版为例 下面简单介绍一下这些模…

SSL证书怎么选?

首先,我们需要理解不同类型的SSL证书及其费用差异。通常情况下,SSL证书分为域名验证型(DV)、组织验证型(OV)和企业验证型(EV)三种。其中,DV证书是最常见的类型&#xff0…

Vue2-Vuex中State、Mutation及mapState辅助函数、mapMutations的基本用法

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 个人笔记,仅供参考。 state:全局共享的响应式数据 mutation:声明修改全局响应式数据…

纯跟踪横向控制和算法仿真实现

文章目录 1. Pure Pursuit2. 算法原理3. 算法和仿真实现 1. Pure Pursuit Pure Pursuit是一种几何跟踪控制算法,也被称为纯跟踪控制算法。他的思想就是基于当前车辆的后轮中心的位置,在参考路径上寻找一个预瞄点,假设车辆可按照一定转弯半径…

odoo16 销售订单中数量与单价,手机录入不方便

odoo16 销售订单中数量与单价,手机录入不方便 在销售订单中,服装批发,数量与单价均是整数,系统默认的为保留两位小数的float类型,输入起来很不方便,如何修改 电脑版,输入时,自动选取…

Linux:NTP校时、PTP校时

目录 前言一、NTP校时1、简介2、ubuntu使用 NTP3、嵌入式设备使用 NTP 校时4、NTP 服务器的校时精度 二、PTP校时1、简介2、ubuntu使用 PTP3、嵌入式设备使用 PTP 校时 三、PTP 校时和 NTP 校时那个精度高一些 前言 在进行网络协议通信时,我们有时候需要计算通信的延…

桌面显示器type-c接口方案

在当今时代,TYPE-C接口桌面显示器已经成为了我们生活和工作中不可或缺的重要设备之一。与传统显示器相比,新型的TYPE-C接口桌面显示器具有更多的功能和优势,其中最显著的特点就是支持视频传输和充电功能。 首先,TYPE-C接口桌面显示…