当前位置: 首页 > news >正文

【企业场景】上线的项目如何进行限流

一、常见的四种速率限流算法

对于限流,最为直接的就是速率限流了

  1. 固定窗口算法
    • 比如 10r/s 就是把时间线分为 1s 一段,也就是周期为 1s,对一个时间段的请求进行计数,超过 10 则舍弃,未超过则直接处理
    • 经过 1s 后,则进入新的周期
  2. 滑动窗口算法
    • 比如 10r/s,但是现在把时间线分得更细了,比如 500ms 一段,但窗口还是 1s,依旧是窗口内的时间段的请求数超过 10 则舍弃,未超过则直接处理
    • 经历 500ms 后,则进入新的周期,窗口也跟着滑过去了

在这里插入图片描述

时间线分得越细,滑动就越平滑

你可以理解为,固定窗口就是周期为 1s,窗口大小为 1s 的滑动窗口,但滑动是最不平滑的

窗口算法有个缺点,就是如果周期过大/滑动不平滑的话,可能会导致某两个周期临界的请求数很多

用滑动窗口确实也能一定程度的解决这个问题

  1. 漏桶算法 (在固定窗口算法的基础上实现)

在固定算法的基础上,允许突发流量的出现,若时间段内的请求数超了,超出的部分可以缓存到 burst 队列,在下一个周期处理,这样就保证请求漏出的速率是一致的,限流范围内的

如果桶满了就洒出去了~

如果 burst=0,那就跟固定窗口,没有区别

在这里插入图片描述

  1. 令牌桶算法 (无需计数)

通过一个固定的速率往令牌桶里输送令牌,而令牌桶有个最大值,达到最大就不能输送令牌了

请求需要有令牌才能被处理,如果没获得令牌,则直接拒绝

这个算法不是按照时间段计数的,所以没有窗口算法那样的临界问题,也允许了一定的突发量

在这里插入图片描述

二、速率限流

根据上线项目的 QPS 对比我们服务的负载能力,适当的对速率进行限流

(1)Nginx 实现固定窗口/漏桶算法

Nginx 的限流功能(如 limit_reqlimit_conn)依赖于标准模块,通常情况下不需要额外安装模块。不过,如果你需要更高级的功能(如 Lua 脚本支持或分布式限流),可能需要安装额外的模块

在这里插入图片描述

突发请求量的处理:

  • burst 就是漏桶的大小,burst 队列的大小
  • 如果设置 nodelay,burst 队列里面的请求,会直接处理,而不是延迟

burst 里面的请求虽然会被立马处理,但在队列里的位置还是占着的,释放的速度还是按照漏出的速率来算,也就是说若出现以下场景:

  1. 第一秒来 15 个请求的话,【处理 10 个请求】,5 个放入 burst 队列并处理
  2. 第二秒来 15 个请求的话,【会优先释放 burst 里的 5 个请求,处理 5 个请求】,5 个放入 burst 队列并处理
    • burst 没位置了,剩余的 5 个拒绝
  3. 第三秒来 10 个请求的话,【会优先释放 burst 里的 5 个请求,处理 5 个请求】,5 个放入 burst 队列并处理
  4. 第四秒来 10 个请求的话,【会优先释放 burst 里的 5 个请求,处理 5 个请求】,5 个放入 burst 队列并处理
  5. 第五秒来 7 个请求的话,【会优先释放 burst 里的 5 个请求,处理 5 个请求】,2 个放入 burst 队列并处理
  6. 第六秒来 7 个请求的话,【会优先释放 burst 里的 2 个请求,处理 7 个请求】
  7. 第七秒来 10 个请求的话,【处理 10 个请求】

(【…】代表正常速率 10r/s)

所以并不是说可以维持在 15r/s,而是某个瞬间可以达到,之后需要给请求慢下来就可以恢复(这样的效果其实类似于令牌桶算法,存在峰值快速处理与恢复期)

(2)滑动窗口算法

Nginx 需要安装 ngx_lua 模块,通过写 lua 脚本才能够实现滑动窗口限流算法,无论你熟不熟悉 lua 脚本,滑动窗口算法用 Nginx 来实现也是相当之麻烦的

滑动窗口算法可能需要从代码层面去解决,在企业里面在这方面应该会有基建

(3)网关实现令牌桶算法

在这里插入图片描述

三、限制连接数/并发量限流

思路:

  • 连接越多或者时间越久,带来的请求就越多,这样就间接影响了速率,这是一个方面
  • 另一个方面,多个连接存在,请求也会同时发送过来,需要考察服务器的并发处理能力,进行并发量限流也是必不可少的

(1)Tomcat 实现

在这里插入图片描述

redirectPort 是资源的访问需要 https,那需要重定向到服务的 https 端口

并不是拒绝后的重定向

(2)Nginx 实现

Nginx 的限流功能(如 limit_reqlimit_conn)依赖于标准模块,通常情况下不需要额外安装模块。不过,如果你需要更高级的功能(如 Lua 脚本支持或分布式限流),可能需要安装额外的模块。

在这里插入图片描述

四、黑白名单

思路:一般正常用户的请求数是在限流范围内的,一些恶意的用户就可能比较危险,我们可以给出 IP 的黑白名单,对某个 IP 直接放行或者拒绝,整体来看,也是起到了限流的效果

# 屏蔽单个ip访问
deny IP;
# 允许单个ip访问
allow IP;
# 屏蔽所有ip访问
deny all;
# 允许所有ip访问
allow all;
#屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 123.0.0.0/8
#屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 124.45.0.0/16
#屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令
deny 123.45.6.0/24

只允许某些 ip:

allow 192.168.100.1;
allow 192.168.100.2;
deny all;

只拉黑某些 ip:

deny 192.168.100.1;
deny 192.168.100.2;

可以将黑白名单配置写到一个配置文件,然后再引用这个配置文件,可以放到 http, server, location 语句块:

include blockip.conf;

五、其他

限制速率和限制连接数:

  • 返回 503,代表服务器无法处理

黑白名单:

  • 返回 403,代表客户端无权访问

分布式限流:

  • 一般限流都可以通过外部中间件实现,让请求访问一个代理/网关(中心化),进行统一的限流,如果需要更定制和更严苛的限流,可能需要自己去写代码控制,使用到 redis、lua 脚本之类的

参考文章:

  • 常用4种限流算法介绍及比较-CSDN博客
  • 【SpringCloud】常见业务问题_网关限流和业务限流-CSDN博客
  • Nginx 限流方式(速率限流、并发限流及黑白名单配置)_nginx 限流类型-CSDN博客

相关文章:

【企业场景】上线的项目如何进行限流

一、常见的四种速率限流算法 对于限流,最为直接的就是速率限流了 固定窗口算法 比如 10r/s 就是把时间线分为 1s 一段,也就是周期为 1s,对一个时间段的请求进行计数,超过 10 则舍弃,未超过则直接处理经过 1s 后&…...

【FL0090】基于SSM和微信小程序的球馆预约系统

🧑‍💻博主介绍🧑‍💻 全网粉丝10W,CSDN全栈领域优质创作者,博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发…...

用大白话解释缓存Redis +MongoDB是什么有什么用怎么用

Redis和MongoDB是什么? Redis:像你家的“小冰箱”,专门存高频使用的食物(数据)。它是基于内存的键值数据库,读写速度极快(每秒超10万次操作)。比如你每次打开手机App,用…...

软件测试需求分析如何实施?专业软件测试服务公司分享

在现代软件开发中,软件测试需求分析被认为是确保软件质量的关键环节之一。软件测试需求分析是指在软件开发过程中,对测试需求进行系统性分析的过程。它旨在确定软件系统功能、性能及其他非功能性需求的具体细节,从而为后续的测试活动提供指导…...

pg pg_prewarm用法

按照插件 > create extension pg_prewarm ;缓存表 > test# select pg_prewarm(weather,buffer ) ; pg_prewarm > ------------ > 1缓存表部分内容 test# select pg_prewarm(weather,buffer,main,0,0) ;pg_prewarm ------------1 (1 row)表大小只有0号…...

2025年光电科学与智能传感国际学术会议(ICOIS 2025)

重要信息 官网:www.ic-icois.org 时间:2025年3月14-16日 地点:中国-长春 简介 2025年光电科学与智能传感国际学术会议(ICOIS 2025)将于2025年3月14-16日在中国-长春隆重召开。会议将围绕“光学光电”、“智能传感”…...

uni小程序wx.switchTab有时候跳转错误tab问题,解决办法

在一个子页面里面使用uni.switchTab或者wx.switchTab跳转到tab菜单的时候,先发送了一个请求,然后执行跳转到tab菜单,但是这个时候,出错了........也是非常的奇怪,不加请求就没问题......但是业务逻辑就是要先执行某个请…...

python-leetcode-下一个排列

31. 下一个排列 - 力扣(LeetCode) class Solution:def nextPermutation(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# Step 1: Find the first decreasing element …...

如何获取mac os 安装盘

发现虚拟机VirtualBox支持Mac虚拟,就想尝试一下。但是发现Mac的安装盘特别难拿到,因此留档。 第一种方法 在mac环境下,使用softwareupdate命令来获取mac安装,能获得当前设备支持的系统。 使用这个命令:/usr/sbin/soft…...

常见AI写作工具介绍(ChatGPT 4o、DeepClaude、Claude 3.5 Sonnet 、DeepSeek R1等)

AI写作工具介绍 1. ChatGPT-4o ChatGPT-4o是OpenAI于2024年5月发布的最新旗舰模型,相比之前的版本,它在多模态支持和实时推理能力上有了显著提升。它能够处理和理解音频、图像和文本数据,适用于复杂的图像分析、语音识别等应用场景[1]。 2…...

环境会影响你的决策:K近邻算法(KNN)

环境会影响你的决策:K近邻算法(KNN) 1. 核心思想与流程 KNN是一种基于局部相似性的分类算法,核心思想是“近朱者赤”:待测样本的类别由其最近的k个邻居的多数类别决定。 关键步骤: 定义空间与距离:通常采…...

JMeter 中实现 100 个用户在 3 秒内并发登录

在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3...

2-3文件的属性信息

文章目录 1 file命令2 stat命令 1 file命令 用来识别文件类型 # 参数的位置是任意的 file 文件名 [参数]-b 只显示文件类型和文件编码,不显示文件名-i 显示文件的MIME类型-F 设置输出字符串的分隔符-L 查看软链接文件自身文件属性liyblyb:/tmp$ file xxxtmp.log …...

【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置)

【【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置) 前言一、Vikunja介绍1.1 Vikunja简介1.2 Vikunja主要特点1.3 使用场景二、相关知识介绍2.1 本次实践存储介绍2.2 k8s存储介绍三、本次实践介绍3.1 本次实践简介3.2 本次环境规划3.3 部署前…...

(IDE接入DeepSeek)简单了解DeepSeek接入辅助开发与本地部署建议

重点:IDE接入DeepSeek是否收费 收费! 本文章主要是为了给小白避雷,目前很多文章告诉大家怎么接入DeepSeek,但是并未告知大家是否收费。如果是想白嫖的,就可以不用去接入了。 一、引言 最近爆火的AI人工智能工具DeepSe…...

TCP的三次握手与四次挥手:建立与终止连接的关键步骤

引言 ‌TCP(传输控制协议)工作在OSI模型的传输层‌。OSI模型将计算机网络功能划分为七个层级,从底层到顶层依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…...

CMU15445(2023fall) Project #3 - Query Execution(上)详细分析

晚日寒鸦一片愁 柳塘新绿却温柔 若教眼底无离恨 不信人间有白头 ——鹧鸪天 完整代码见: SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering determination, we pre…...

.sql文件怎么打开

.sql 文件是一个 SQL 脚本文件,通常包含了数据库的 SQL 查询语句,可以是创建数据库、创建表、插入数据、查询数据等操作。要打开并查看 .sql 文件,你可以使用以下几种方法: 1. 使用文本编辑器打开 .sql 文件是一个文本文件&…...

【Swift 算法实战】城市天际线问题解法

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

Linux的软件安装

Linux命令行内的“应用商店” yum命令安装软件。 yum命令: yum:RPM软件管理器,用于自动化安装配置Linux软件,可以自动解决依赖问题。 语法:yum [-y] [install | remove | search] 软件名称 选项:-y。自动确…...

需求和开发模型

文章目录 什么是需求?用户需求软件需求用户需求和软件需求的不同 开发模型什么是“模型”?软件的生命周期常见的开发模型瀑布模型(Waterfall Model)螺旋模型增量模型、迭代模型敏捷模型 测试模型V 模型W 模型(双 V 模型…...

unity学习61:UI布局layout

目录 1 布局 layout 1.1 先准备测试UI,新增这样一组 panel 和 image 1.2 新增 vertical layout 1.3 现在移动任意一个image 都会影响其他 1.3.1 对比 如果没有这个,就会是覆盖效果了 1.3.2 对比 如果没有这个,就会是覆盖效果了 1.4 总结&#xf…...

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析 腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)作为当前文生图领域的两大代表模型,各自…...

Flume

Flume安装配置 使用的三台主机名称分别为bigdata1,bigdata2,bigdata3。所使用的安装包名称按自己的修改,安装包可去各大官网上下载 1.解压 将Master节点Flume安装包解压到/opt/module目录下 tar -zxvf /opt/software/apache-flume-1.9.0-bi…...

【Python LeetCode】面试经典 150 题

数组 / 字符串快慢指针(双指针)总结88. 合并两个有序数组27. 移除元素26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II Boyer-Moore 投票算法169. 多数元素扩展:寻找 n/3 多数元素 翻转法189. 轮转数组 贪心121. 买卖股票的最佳时机…...

营养助力:进行性核上性麻痹患者的饮食管理

进行性核上性麻痹是一种复杂的神经系统退行性疾病,科学的饮食管理不仅能够改善患者的营养状况,还能为神经系统提供必要的支持,延缓病情进展。 这种疾病会导致吞咽困难、营养吸收障碍等问题,增加营养不良的风险。针对性的饮食调理能…...

spineNET模型详解及代码复现

模型背景 在SpineNet模型诞生之前,多尺度特征融合已成为计算机视觉领域的研究热点。研究者们提出了各种方法来处理不同尺度的特征,如 特征金字塔网络(FPN) 和 深度可分离卷积 。然而,这些方法在跨尺度特征融合方面仍存在局限性。 FPN通过自上而下的路径融合不同尺度的特…...

【Mybatis】如何简单使用mybatis-plus,以及MybatisGenerator自动生成或者实现SQL语句

前言 🌟🌟本期讲解关于mybatis中SQL自动生成的相关知识介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆…...

ds-国内主要显卡

国产显卡 寒武纪思元系列 思元 370:采用 7nm 制程工艺及 chiplet 技术,集成 390 亿个晶体管,最大算力高达 256TOPS(INT8)。是国内第一款公开发布支持 LPDDR5 内存的云端 AI 芯片,内存带宽是上一代产品的 3 …...

类和对象——const修饰的类的对象和函数

const修饰的类的对象和函数 const成员函数和const对象1 const成员函数2 调用关系3 const在成员函数中的位置4 取地址&及const取地址操作符重载 const成员函数和const对象 1 const成员函数 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数&…...

防火墙的智能选路与NAT实验

实验拓扑 配置IP 防火墙的安全区域划分 销售部和运维部不能互相访问,采取vlan的方式来进行隔离。 在配置vlan之后 ,两个部门将不会通信。 以上是基础配置,只是演示在各个部门不通的情况下,使用什么技术来进行隔离网络,…...

ARM学习(43)armcc HardFault函数链接不到的问题理解

armcc HardFault函数链接不到的问题理解 1、问题背景: 笔者汇编语言编写了一个HardFault异常处理函数,HardFault函数属于芯片架构异常处理函数,没有显著的调用(中断向量表中有该函数地址),且启动函数里面也…...

php序列化与反序列化

文章目录 基础知识魔术方法:在序列化和反序列化过程中自动调用的方法什么是 __destruct() 方法?何时触发 __destruct() 方法?用途:语法示例: 反序列化漏洞利用前提条件一些绕过策略绕过__wakeup函数绕过正则匹配绕过相…...

【STL】7.STL常用算法(2)

STL常用算法(2) 前言简介四.常用拷贝和替换算法1.copy2.replace3.replace_if4.swap 五.算术生成算法1.accumulate2.fill 六.常用集合算法1.set_intersection2.set_union3.set_difference 总结 前言 stl系列主要讲述有关stl的文章,使用STL可以…...

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验 目录 怎么获取免费的 GPU 资源完成大语言模型(LLM)实验在线平台类Google ColabKaggle NotebooksHugging Face Spaces百度飞桨 AI Studio在线平台类 Google Colab 特点:由 Google 提供的基于云端的 Jupyter 笔记本环境,提…...

xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研

目录 识别物体规范 3D Marker 识别目标文件 map 生成 生成任务状态解析 服务耗时: 对传入的视频有如下要求: 对传入的视频建议: 识别物体规范 为提高Marker质量,保证算法识别效果,可参考Marker规范文档 Marker规…...

盛京开源社区加入 GitCode,书写东北开源生态新篇章

在数字化转型与开源技术蓬勃发展的浪潮下,开源社区已成为推动技术创新的核心力量。盛京开源社区(SJOSC)作为沈阳地区的开源交流平台,始终致力于连接开发者、企业及高校,构建区域技术生态圈。 现在,盛京开源…...

【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL

SQL备忘录 from to : 点击访问源地址...

几个api

几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…...

(转)Java单例模式(1)

l单例模式的好多:节约了内存,提高了代码的执行效率。...

return和print

目录 1.print的用法 2.return的用法 3. print 和 return 的区别 4.总结 1.print的用法 print 是一个函数,用于将信息输出到控制台(终端)。它主要用于显示程序运行的结果,方便用户查看。print 的作用是输出内容,而不…...

设计模式——过滤器模式在 Spring 中的实践

设计模式——过滤器模式在 Spring 中的实践 基础介绍模块介绍简单实现业务落地额外问题 基础介绍 过滤器模式(Filter Pattern),也称为标准模式(Criteria Pattern),是结构型设计模式之一,旨在通…...

15.7 LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统

LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统 关键词:LangChain 销售系统、知识图谱集成、对话状态管理、生产级部署、多链协同优化 1. LangChain 销售系统架构设计 1.1 模块化架构全景图 #mermaid-svg-42MLuD3aMcpX0y8c {font-family:"trebuchet ms&q…...

QT异步编程之线程池QThreadPool

一、概述 在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建线程并销毁线程的过程势必会消耗内存。QThreadPool是Qt框架中用于管理线程池的类。它提供了一种高效的方式来管理和重用线程,从而…...

HTMLS基本结构及标签

HTML5是目前制作网页的核心技术&#xff0c;有叫超文本标记语言。 基本结构 声明部分位于文档的最前面&#xff0c;用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后&#xff0c;用于告知浏览器这是一个HTML文档。< html>表示文档开始&#xff0c;&l…...

linux(2)用户管理

文章目录 1. 切换用户2. 添加删除用户3.写改密码 1. 切换用户 # 切换用户名&#xff0c;不切换工作目录 su 用户名 # 一起切换工作目录 su - 用户名 # 退出用户 exit2. 添加删除用户 # 添加用户 sudo adduser username # 推荐sudo useradd -m -s /bin/bash 用户名-m 如果创建…...

蓝桥杯好题推荐----高精度乘法

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 题目链接 P1303 A*B Problem - 洛谷https://www.luogu.com.cn/problem/P1303 解题思路 这道题的思路&#xff0c;其实和前面差不多&#xff0c;我们主要说一下最为关键的部分&…...

辛格迪客户案例 | 甫康(上海)健康科技有限责任公司药物警戒管理系统(PVS)项目

01 案例企业 甫康(上海)健康科技有限责任公司&#xff08;简称“甫康”&#xff09;该公司成立于2015年11月3日。公司的核心团队由来自中国和国外顶级制药公司的专业人士组成&#xff0c;与中国科学院上海药物研究所等知名研究机构保持紧密合作。此外&#xff0c;甫康药业还与…...

【Java】System 类

目录 静态字段标准输入输出流相关 常用静态方法数组操作时间操作系统操作属性操作安全管理 其他方法 System 类位于 java.lang 包下&#xff0c;是一个 final 类&#xff0c;意味着它不能被继承。并且其所有构造方法都是私有的&#xff0c;这使得我们无法创建 System 类的实例&…...

认识苹果APP开发框架

苹果APP开发框架是苹果公司为开发者提供的一套工具和API&#xff0c;旨在帮助开发者高效、安全地构建高质量的iOS、macOS、watchOS和tvOS应用程序。以下是对苹果APP开发框架的详细认识&#xff1a; 1. 框架的定义与作用 框架&#xff08;Framework&#xff09;是包含方法资源…...