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
英文地址,請注明出處:http://en.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、具體運算符及示例 七、移位運算符…