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

news2025/3/1 17:58:58

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

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

  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博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git - study

文章目录 git - study概述可以用 git gui工具来添加快捷命令工具如果要在提交日志中搜索,可以用gitk的view编辑功能实验环境直接用git自带环境进行git操作的好处查看git所有配置配置全局数据配置项目专用的数据查询配置数据的原始值配置git使用的文本编辑器获取某个…

FPGA之硬件设计笔记-持续更新中

目录 1、说在前面2、FPGA硬件设计总计说明3、 原理图详解 - ARITX - 7 系列3.1 顶层框图介绍3.2 FPGA 电源sheet介绍:3.2.1 bank 14 和 bank 15的供电3.2.2 bank 0的供电3.2.3 Bank34 35 的供电 3.3 核电压和RAM电压以及辅助电压 4 原理图详解-- Ultrascale ARTIX4.…

嵌入式开发:傅里叶变换(5):STM32和Matlab联调验证FFT

目录 1. MATLAB获取 STM32 的原始数据 2. 将数据上传到电脑 3. MATLAB 接收数据并验证 STM32进行傅里叶代码 结果分析 STM32 和 MATLAB 联调是嵌入式开发中常见的工作流程,通常目的是将 STM32 采集的数据或控制信号传输到 MATLAB 中进行实时处理、分析和可视化…

Cursor AI编程-详细教程

一点准备工作 Cursor方法论:简单到没有方法 Cursor能做什么 Cursor官网:https://www.cursor.com/ja Cursor文档:Cursor – Welcome to Cursor Cursor论坛:Weekly - Cursor - Community Forum 写程序代码 举例: 设…

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式?二、 为什么要用模板方法模式?三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&a…

泛型编程、函数模板、类模板

目录 一、泛型编程 1.泛型编程提出背景 1.1.代码复用案例解析 案例1:实现一个交换函数,并对不同类型参数进行函数重载 (1)调试 (2)代码解析 ①代码复用问题 ②泛型编程的解决方案 ③上面泛型Swap函数模版的优点 1.2.泛型编程提出背景 2.泛型编…

【Vue3】浅谈setup语法糖

Vue3 的 setup 语法糖是通过 <script setup> 标签启用的特性&#xff0c;它是对 Composition API 的进一步封装&#xff0c;旨在简化组件的声明式写法&#xff0c;同时保留 Composition API 的逻辑组织能力。以下是其核心概念和原理分析&#xff1a; 一、<script setu…

简洁的个人地址发布页HTML源码

源码介绍 简洁的个人地址发布页HTML源码,源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果 效果预览 源码获取 简洁的个人地址发布页HTML源码

wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 问题一&#xff1a;wav格式的音频压缩为哪些格式&#xff0c;网络传输给用户播放…

Linux权限 -- 开发工具(一)

文章目录 包管理器yumyum具体操作 Linux编辑器 - vim的使用vimvim的多模式 包管理器yum Linux中安装软件&#xff1a; 1.源码安装 2. 软件包安装 – rpm 3. 包管理器yum(centos) apt/apt-get(ubuntu) 为什么有包管理器&#xff1f; 包管理器会自动帮我们解决包依赖的问题 2. 什…

【leetcode】二分查找专题

文章目录 1.二分查找1.题目2.解题思路3. 解题代码 2.在排序数组中查找元素的第一个和最后一个位置1.题目2.算法原理3. 代码 3.x的平方根1.题目2.代码 4.搜索插入位置1.题目2.解题思路3.解题代码 5.山脉数组的索引1.题目2.解题思路3. 代码 6.寻找峰值1.题目2.解题思路3.代码 7. …

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集&#xff1a; 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中&#xff0c;实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送&#xff0c;还是多人协作工具&#xff0c;WebSocket 都是实现高效实时通信的最佳选择之一。本…

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…

unity学习59: 滑动条 和 滚动条 滚动区域

目录 1 滑动条 slider 1.1 创建slider 1.2 构成的子物体 1.2.1 找到 某个UI的 方法 1.3 构成的component&#xff0c;主体就是 slider 2 核心属性 2.1 value 2.2 direction 3 作用 3.1 由于是fill back 可以实现血条效果 3.2 可以取得 slider.value 数值 1 滑动条…

基于vue框架的游戏博客网站设计iw282(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,博客信息,资源共享,游戏视频,游戏照片 开题报告内容 基于FlaskVue框架的游戏博客网站设计开题报告 一、项目背景与意义 随着互联网技术的飞速发展和游戏产业的不断壮大&#xff0c;游戏玩家对游戏资讯、攻略、评测等内容的需求日…

UWB人员定位:精准、高效、安全的智能管理解决方案

在现代企业管理、工业生产、安全监测等领域&#xff0c;UWB&#xff08;超宽带&#xff09;人员定位系统正逐步成为高精度定位技术的首选。相较于传统的GPS、Wi-Fi、蓝牙等定位方式&#xff0c;UWB具备厘米级高精度、低延迟、高安全性、抗干扰强等突出优势&#xff0c;能够实现…

在ubuntu 24.04.2 通过 Kubeadm 安装 Kubernetes v1.31.6

文章目录 1. 简介2. 准备3. 配置 containerd4. kubeadm 安装集群5. 安装网络 calico 插件 1. 简介 本指南介绍了如何在 Ubuntu 24.04.2 LTS 上安装和配置 Kubernetes 1.31.6 集群&#xff0c;包括容器运行时 containerd 的安装与配置&#xff0c;以及使用 kubeadm 进行集群初始…

DO-254航空标准飞行器电机控制器设计注意事项

DO-254航空标准飞行器电机控制器设计注意事项 1.核心要求1.1 设计保证等级(DAL)划分1.2生命周期管理1.3验证与确认2.电机控制器硬件设计的关键注意事项2.1需求管理与可追溯性2.2冗余与容错设计2.3验证与确认策略2.4元器件选型与管理2.5环境适应性设计2.6文档与配置管理3.应用…

解决Deepseek“服务器繁忙,请稍后再试”问题,基于硅基流动和chatbox的解决方案

文章目录 前言操作步骤步骤1&#xff1a;注册账号步骤2&#xff1a;在线体验步骤3&#xff1a;获取API密钥步骤4&#xff1a;安装chatbox步骤5&#xff1a;chatbox设置 价格方面 前言 最近在使用DeepSeek时&#xff0c;开启深度思考功能后&#xff0c;频繁遇到“服务器繁忙&am…

python-leetcode-使用最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 解法 1&#xff1a;动态规划&#xff08;O(n) 时间&#xff0c;O(n) 空间&#xff09; class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:n len(cost)dp [0] * (n 1) # 额外多…