IP 限流 vs. URI 限流

背景:

昨天调程序的时候遇到了一个 BUG,前端无法将文件正确传给后端,后端报错 EOFException(EOF 代表 End Of File)就是在程序尝试从一个数据流中读取数据时,发现已经到达了数据流的末尾,但它却期望还能继续读取更多数据时抛出的异常。

分析概括为:前端与后端建立了 TCP 连接,后端 tomcat 要从这个连接中读取信息,但一直没有读到就报这个错误了。

问题的起因令我发笑,分析了一堆代码,却忘了我前端服务器带宽 1Mbps,后端服务器带宽 3Mbps,导致我的整个 TCP 链路带宽只有 1Mbps,请求被限流,而后端 tomcat 在建立 TCP 连接后就一直尝试从连接中获取信息,迟迟不来就报 EOFException。

那就借此机会分析一下云厂商的服务器是如何实现带宽限制的吧

  • 请求到达 nginx 反向代理获取目标地址会向目标地址(IP+端口)发送一个新的 TCP 链接,这个过程会经过 3 次握手,然后后端服务器会创建一个对应的 socket,这时候后端服务(tomcat)就进入了“备战状态”,准备接受和处理数据,且 tomcat 是知道被调用的接口是哪一个,信息在请求的 URI 中。

  • nginx 将文件分片数据通过建立的连接发送给后端服务器,图中会经过很多基础设施:边缘路由器、交换机、虚拟网络设备。

  • 流量控制具体实现:

云厂商通常采用 流量整形 (Traffic Shaping)流量控制 (Traffic Control) 的技术来实现对云服务器带宽的限制。这就像在您的服务器网卡前面放了一个“水龙头”,控制着流向服务器的数据流量的最大速度。

这个“水龙头”通常部署在云厂商的网络设备上,例如:

  • 边缘路由器或交换机: 位于云厂商数据中心网络的边缘,靠近您的云服务器实例。

  • 虚拟网络设备: 在虚拟化环境中,可能存在一个虚拟的网络设备层,负责管理虚拟机实例的网络流量。

带宽限制逻辑出现的时间点:

带宽限制的逻辑并不是在您的云服务器实例与外部建立 TCP 连接时才“出现”的。它是一个 持续存在且作用于所有进出该云服务器实例的流量 的限制。

更准确地说,当外部网络的数据包到达云厂商的网络基础设施,并且目标是您的 3Mbps 带宽的云服务器实例时,带宽限制的逻辑就会开始工作。

具体的工作流程(简化版):

  1. 外部数据包到达云厂商网络: 外部网络(例如互联网)的数据包通过云厂商的骨干网络传输,最终到达离您的云服务器实例最近的云厂商网络设备。

  2. 识别目标服务器: 云厂商的网络设备根据数据包的目标 IP 地址(您的云服务器公网 IP)识别出该数据包是发往您的特定云服务器实例的。

  3. 应用流量控制策略: 云厂商的网络设备会查找与您的云服务器实例关联的带宽限制配置(例如 3Mbps)。

  4. 流量整形/控制:

    • 对于入站流量(进入您的服务器): 网络设备会根据 3Mbps 的限制,控制将数据包发送到您的云服务器实例的速度。如果瞬间到达的数据量超过 3Mbps,网络设备会将多余的数据包进行缓冲或延迟发送,直到平均速度不超过 3Mbps。

    • 对于出站流量(从您的服务器发出): 类似地,网络设备也会控制从您的服务器发出的数据包的速度,确保不超过 3Mbps 的限制。

  5. 数据包转发到云服务器: 经过流量整形/控制后,数据包才会被转发到您的云服务器实例的虚拟网卡。

说简单点就是,云厂商的基础设施会存储我的云服务器 IP 以及其带宽限制为 3Mbps 的信息,当我的请求到达这些设备的时候会经过判断然后做一些相应的限流操作,这期间我的数据包会在这些网络设备中被缓存或者是被延迟发送,从而达到限流操作。

这个时候 tomcat 达到了时间限制,就会认为连接出了问题,就会抛异常如SocketTimeoutException ,在文件上传场景下可能是EOFException

云主机限制了带宽,也是一种限流,这令我想到了 Sentinel 实现的对微服务接口以及 Gateway 的限流,那就先分析一下 Sentinel:

  • 微服务限流(Sentinel)是更细粒化、更上层的,目标是主机上的特定服务或接口,限制的是到达该服务或接口的请求速率。它是在请求到达服务进程后才开始判断和限制的。

  • Gateway 限流介于两者之间,它是一个独立的微服务,但它处理的是 HTTP 请求,可以基于 URI 等信息进行限流,比云厂商的 IP 级限流更细,但比 Sentinel 集成在业务服务内部的限流可能稍微粗一些(取决于 Gateway 的配置)。Gateway 的限流也是在请求到达 Gateway 服务后进行的。

两种限流机制的对比:
在这里插入图片描述

本篇文章很易懂但也很浅显,欢迎订阅合集一起探索网络的世界🎉

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

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

相关文章

2025年Java常见面试题(持续更新)

数据库事务特性。原子性、一致性、隔离性、持久性如何防止SQL注入:使用#不要使用$符号;对所有的入参做校验;使用存储过程;执行预处理语句和参数化查询;最低权限原则;微服务拆分的原则:微服务的拆…

Spring AI ——在springboot应用中实现基本聊天功能(ChatModel)

文章目录 前言项目版本依赖引入配置key信息编写测试接口注入ChatModel并普通返回注入ChatModel并流式返回自定义模型对象并直接返回总结前言 在Spring AI 中,CchatClient 是一个所有大模型通用性的调用方式,对绝大多数大模型的功能点都具备封装和见解调用性。 但这一点在部…

78、系统工程生命周期阶段及方法

一、系统工程生命周期的七大阶段 系统工程生命周期涵盖从概念萌芽到系统退役的全过程,通常分为以下七个阶段,每个阶段具有明确目标与核心任务: 1.探索性研究阶段 目标:识别利益相关者需求,探索技术可行性。任务&…

二十九、【用户体验篇】个人中心:用户资料展示与密码修改

二十九、【用户体验篇】个人中心:用户资料展示与密码修改 前言准备工作第一部分:后端实现 - 个人中心 API1. 修改 `UserDetailSerializer` 以支持密码修改2. 在 `api/views.py` 中添加 `UserMeView` 和 `PasswordChangeView`3. 注册个人中心相关 API 路由4. 后端初步测试第二…

STEP-BACK PROMPTING:退一步:通过抽象在大型语言模型中唤起推理能力

摘要 我们提出了 STEP-BACK PROMPTING,这是一种简单的提示技术,可以让LLM进行抽象,从包含具体细节的实例中推导出高层次概念和第一性原理。利用这些概念和原理来引导推理过程,LLM在朝向正确解答路径上显著提升了推理能力。我们在…

Paimon vs. HBase:全链路开销对比

Paimon 在特定场景(如流式 Lookup Join)下,会为了极致的查询性能而引入额外的存储(本地磁盘 LookupFile)和计算(构建 LookupFile)开销。但这是一种用一次性的、可控的开销,换取后续持…

本地的包名导致的AttributeError: module ‘langchain‘ has no attribute ‘verbose‘

你遇到的 AttributeError: module langchain has no attribute verbose 问题,确实可能是因为你的本地文件或目录名与 langchain 官方包冲突,导致 Python 在导入时优先加载了你的本地文件而非真正的 langchain 库。 问题原因 Python 模块加载机制&#xf…

玄机——某学校系统中挖矿病毒应急排查

本篇文章主要记录某学校长期未运营维护的程序,被黑客发现了漏洞,但好在学校有全流量设备,抓取到了过程中的流量包 需要你进行上机以及结合流量分析,排查攻击者利用的漏洞以及上传利用成功的木马 文章目录 靶机介绍1.使用工具分析共…

如何解决wordpress批量删除媒体库中的图片很慢甚至卡死问题

批量删除WordPress媒体库中的图片速度很慢,如果批量删除的图片多会出现CPU100%甚至卡死,出现这个问题通常最主要的原因是服务器性能问题,如果换成性能好的服务器就不会了,比如换Siteground 家的服务器,就不会有这个问题…

深度学习入门day4--手写数字识别初探

鱼书提供的代码可以在github找到。源码地址 环境配置部分可以看前面几篇博客,还是用Anaconda,运行下面代码,可以看哪个库缺失。 import importlib import numpy as np deps {"torch": "torch","torchvision"…

STM32中定时器配置,HAL_Delay的原理,滴答定时器,微秒延时实现,PWM,呼吸灯

目录 定时器基本定时功能实现 CubeMX设置 手动书写代码部分 定时器启动 实现溢出回调函数 HAL_Delay介绍 HAL_Delay实现原理 HAL_Delay的优点 HAL_Delay的缺点 利用滴答定时器(SysTick)实现微秒级延时 PWM PWM介绍 通用定时器中的重要寄存器 PWM中的捕获比较通道 …

飞牛NAS(fnOS)详细安装教程

以下是飞牛NAS(fnOS)的详细安装教程,结合官方指南和社区实践整理而成: 一、准备工作 硬件需求 8GB或更大容量的U盘(用于制作启动盘)待安装设备(支持x86架构的物理机或迷你主机,如天钡…

springboot 显示打印加载bean耗时工具类

一 spring的原生接口说明 1.1 接口说明 Aware是Spring框架提供的一组特殊接口,可以让Bean从Spring容器中拿到一些资源信息。 BeanFactoryAware:实现该接口,可以访问BeanFactory对象,从而获取Bean在容器中的相关信息。 Environm…

OpenGL空间站场景实现方案

OpenGL空间站场景实现方案 需求分析 根据任务要求,我需要完成一个基于Nehe OpenGL的空间站场景,实现以下功能: 完整的空间站场景建模(包含多个模型和纹理贴图)Phong光照模型实现(包含多种光源和材质效果)摄像机键盘控制交互功能解决方案设计 技术栈 C++编程语言OpenG…

基于昇腾310B4的YOLOv8目标检测推理

YOLOv8目标检测 om 模型推理 本篇博客将手把手教你如何将 YOLOv8 目标检测模型部署到华为昇腾 310B4 开发板上进行高效推理(其他昇腾开发版也可参考此流程)。 整个流程包括: 模型格式转换(ONNX → OM)昇腾推理环境配…

前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy

在前端开发中,跨域资源共享(CORS)是一个常见的问题。它涉及到浏览器安全机制,防止网页从一个域获取资源时被另一个域阻止。错误信息如“Access to XMLHttpRequest at xxx from origin has been blocked by CORS policy”是典型的跨…

[ linux-系统 ] 软硬链接与动静态库

软硬链接 介绍 软链接 通过下图可以看出软链接和原始文件是两个独立的文件,因为软链接有着自己的inode编号: 具有独立的 inode ,也有独立的数据块,它的数据块里面保存的是指向的文件的路径,公用 inode 硬链接 通过…

3D 商品展示与 AR 试戴能为珠宝行业带来一些便利?

对于珠宝行业而言,长久以来,如何让消费者在做出购买决策之前,便能真切且直观地领略到珠宝独一无二的魅力,始终是横亘在行业发展道路上的一道棘手难题。而 3D 互动营销的横空出世,恰似一道曙光,完美且精准地…

电子电气架构 --- SOVD功能简单介绍

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

【Java编程动手学】 Java中的运算符全解析

文章目录 一、引言二、算术运算符1、基本概念2、具体运算符及示例 三、关系运算符1、基本概念2、具体运算符及示例 四、自增减运算符1、基本概念2、具体运算符及示例 五、逻辑运算符1、基本概念2、具体运算符及示例 六、位运算符1、基本概念2、具体运算符及示例 七、移位运算符…