一次 web 請求響應中,通常那個部分最耗時?

文章目錄

  • 一次Web請求的完整旅程
    • 1. DNS解析
    • 2. TCP連接建立
    • 3. 發送HTTP請求
    • 4. 服務器處理
    • 5. 服務器響應
    • 6. 瀏覽器渲染
  • 哪個環節通常最耗時?
    • 1. 數據庫查詢
    • 2. 外部API調用
    • 3. 復雜的業務邏輯
  • 如何優化各個環節?
    • 1. 數據庫優化
    • 2. 緩存策略
    • 3. 異步處理
  • 總結

一次Web請求的完整旅程

當用戶在瀏覽器地址欄輸入網址并按下回車,到最終看到頁面內容,這中間經歷了什么?我們來拆解一下這個過程:

1. DNS解析

瀏覽器首先要把域名轉換成IP地址。比如把"www.baidu.com"轉換成"120.5.5.46"。這個時間取決于DNS服務器的響應速度、是否有DNS緩存還有良好的網絡環境。

2. TCP連接建立

找到IP地址后,瀏覽器需要和服務器建立TCP連接,這就是三次握手,主要受網絡延遲影響。

3. 發送HTTP請求

連接建立后,瀏覽器發送HTTP請求到服務器,這個過程通常很快,除非請求數據很大。

4. 服務器處理

服務器接收到請求后,開始處理業務邏輯。這通常是最"邪門"的環節。

5. 服務器響應

服務器將處理結果發送回瀏覽器。主要取決于響應數據的大小和網絡帶寬。

6. 瀏覽器渲染

瀏覽器接收到HTML后,開始解析、渲染頁面,時間取決于加載的庫、腳本等需要網絡的組件的數量的網絡消耗。

哪個環節通常最耗時?

答案:通常是服務器處理時間

在大多數情況下,服務器處理時間是最大的性能瓶頸。為什么這么說?

1. 數據庫查詢

現在的Web應用大多需要查詢數據庫:

-- 一個復雜的查詢可能需要幾百毫秒甚至幾秒
SELECT u.name, p.title, COUNT(c.id) as comment_count
FROM users u
JOIN posts p ON u.id = p.user_id
LEFT JOIN comments c ON p.id = c.post_id
WHERE u.created_at > '2023-01-01'
GROUP BY u.id, p.id
ORDER BY comment_count DESC
LIMIT 20;

如果沒有合適的索引,這樣的查詢輕松就能花掉幾秒鐘。

2. 外部API調用

很多應用需要調用第三方服務:

  1. 支付接口調用
  2. 地圖服務API
  3. 短信發送服務

每個外部調用都可能增加幾百毫秒的延遲,而且還可能失敗重試。

3. 復雜的業務邏輯

  1. 服務之間的調用(RPC)
  2. 復雜的業務邏輯(電商的價格計算)
  3. 數據處理(格式轉換與序列化)
  4. 上傳大文件、文件壓縮(Zip)
  5. 權限校驗(用戶身份認證)
  6. 記錄日志(操作日志持久化到磁盤)
    這些操作都要銷毀大量的時間,耗時比較久。

如何優化各個環節?

1. 數據庫優化

-- 給常用查詢字段加索引
CREATE INDEX idx_user_id ON posts(user_id);-- 用JOIN替代循環查詢
SELECT p.title, u.name 
FROM posts p JOIN users u ON p.user_id = u.id;

索引是一種高效的數據結構,可以提高數據的查詢效率。

2. 緩存策略

@Service
public class ProductService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Autowiredprivate ProductMapper productMapper;public List<Product> getHotProducts() {String cacheKey = "hot_products";// 先查緩存List<Product> cached = (List<Product>) redisTemplate.opsForValue().get(cacheKey);if (cached != null) {return cached;}// 緩存沒有,查數據庫List<Product> products = productMapper.getHotProducts();// 存入緩存,5分鐘過期redisTemplate.opsForValue().set(cacheKey, products, 5, TimeUnit.MINUTES);return products;}
}

熱點數據被頻繁查詢,每次都查數據庫會把數據庫拖垮。緩存后,100個用戶訪問只需要查1次數據庫,這樣不僅提高的數據的查詢,還減少了磁盤IO,縮短了時間。

3. 異步處理

@RestController
public class OrderController {@Autowiredprivate OrderService orderService;@Autowiredprivate AsyncTaskService asyncTaskService;@PostMapping("/order")public ResponseEntity<?> createOrder(@RequestBody OrderRequest request) {// 先快速創建訂單并響應Order order = orderService.createOrder(request);// 異步處理耗時任務asyncTaskService.sendOrderEmail(order.getId());asyncTaskService.updateInventory(order.getItems());return ResponseEntity.ok(Map.of("orderId", order.getId(), "status", "processing"));}
}@Service
public class AsyncTaskService {@Asyncpublic void sendOrderEmail(Long orderId) {// 發送訂單確認郵件(耗時操作)emailService.sendOrderConfirmation(orderId);}@Async  public void updateInventory(List<OrderItem> items) {// 更新庫存(可能需要調用多個服務)inventoryService.updateStock(items);}
}

主線程專注處理核心業務,耗時操作放到后臺慢慢處理,整體吞吐量大大提升。

總結

所以一次Web請求響應中最耗時的大多數情況下是服務器處理時間,特別是數據庫查詢和外部API調用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93688.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93688.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93688.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IO流-概述和體系

1.什么是I0流?存儲和讀取數據的解決方案|: input 0: output流:像水流一樣傳輸數據2.10流的作用?用于讀寫數據(本地文件&#xff0c;網絡)3. I0流按照流向可以分類哪兩種流?輸出流:程序-->文件輸入流:文件-->程序4. I0流按照操作文件的類型可以分類哪兩種流?…

提高建筑舒適度與能源效率,樓宇自控系統意義重大

隨著城市化進程的加速和人們對建筑環境要求的不斷提高&#xff0c;如何在保證建筑舒適度的同時提升能源效率&#xff0c;成為建筑行業面臨的重要課題。樓宇自控系統&#xff08;Building Automation System&#xff0c;簡稱BAS&#xff09;作為現代智能建筑的核心組成部分&…

學習筆記《區塊鏈技術與應用》第4天 比特幣腳本語言

輸入0.7 輸出0.5 23個確認 不太可能回滾了交易id hash值 版本 locktime 交易剩下時間&#xff1a;0立即生效 confirmation:確認信息 time&#xff1a;產生時間 blocktime&#xff1a;塊產生時間vout: 交易中第0個輸入 scriptSig&#xff1a;輸入腳本&#xff08;input script)n…

3.Linux 系統文件類型與文件權限

1.文件類型Linux 下所有的東西都可以看做文件&#xff0c;Linux 將文件分為以下幾種類型&#xff1a;普通文件 ‘-’目錄文件 ‘d’管道文件 ‘p’鏈接文件 ‘l’設備文件&#xff08;塊設備 ’b’ 、字符設備 ‘c’&#xff09;套接字文件 ‘s’Linux 上不以文件的擴展名區別文…

訂單識別技術原理及場景應用

訂單OCR&#xff08;光學字符識別&#xff09;技術通過圖像處理和深度學習算法&#xff0c;將紙質或電子版訂單中的文字信息轉化為結構化數據。以下是其技術原理和典型應用場景的詳細解析&#xff1a;一、技術原理剖析1. 核心處理流程圖像預處理去噪&#xff1a;消除陰影、折痕…

[優選算法]復寫零

題目鏈接 LeetCode復寫零 題目描述 題目解析 一、問題理解 題目要求&#xff1a;給定一個整數數組 arr&#xff0c;在不創建新數組的情況下&#xff0c;將每個出現的 0 復寫一遍&#xff08;即一個 0 變成兩個 0&#xff09;&#xff0c;同時保持其他元素的相對順序不變。復…

element UI的el-table組件,實現可以拖動

表格 <div class"main_table"><el-table id"elTableid" :data"fieldArr" border style"width: 100%" row-class-name"drag-row"current-row-key highlight-current-row><el-table-column type"index&qu…

Android Emoji 全面解析:從使用到自定義

引言 Emoji已經成為現代數字通信不可或缺的一部分&#xff0c;這些小小的圖標能夠跨越語言障礙&#xff0c;直觀地表達情感和想法。在Android開發中&#xff0c;正確處理和顯示Emoji是提升用戶體驗的重要環節。本文將全面介紹Android平臺上的Emoji支持&#xff0c;包括系統集成…

數據中心入門學習(五):服務器CPU

目錄CPU1 概述1.1 概念1.2 馮諾依曼架構1.3 常見參數&#xff08;評估性能&#xff09;1.4 按指令集分類2 CPU發展2.1 發展史2.2 行業產業鏈2.3 英特爾 Xeon 至強處理器2.4 AMD Zen架構補充1 寄存器、存儲器、內存、緩存、硬盤區別與聯系&#xff1f;2 浮點單元參考本篇記錄和梳…

基于MySQL實現基礎圖數據庫

基于MySQL實現基礎圖數據庫 一、概念 圖數據庫是一種用于存儲和查詢具有復雜關系的數據的數據庫。在這種數據庫中&#xff0c;數據被表示為節點&#xff08;實體&#xff09;和邊&#xff08;關系&#xff09;。圖數據庫的核心優勢在于能夠快速地查詢和處理節點之間的關系。 圖…

RAG面試內容整理-9. 查詢改寫與增強(Query Rewriting, Query Expansion)

查詢改寫和查詢增強是兩種提升檢索效果的技術,目標是在不改變用戶意圖的前提下,使檢索器收到的查詢更全面或明確,從而找到更多相關信息。 查詢改寫通常指將原始查詢轉換成語義等價但更明晰的形式。上一節談到的對話查詢改寫是一個典型場景。在一般情況下,查詢改寫也適用于澄…

golang設置http代理

問題場景&#xff1a; golang通過eino的官方agent示例調用duckduckgo進行聯網搜索時出現網絡問題&#xff0c;電腦此時是掛了工具的瀏覽器整出打開 官方示例&#xff1a;https://www.cloudwego.io/zh/docs/eino/quick_start/agent_llm_with_tools/ 問題原因&#xff1a;go代碼沒…

Elasticsearch 現在默認啟用 BBQ,并通過 ACORN 實現過濾向量搜索

作者&#xff1a;來自 Elastic Gilad Gal 探索 Elasticsearch 的向量搜索如何以更快的速度、更低的成本提供更優結果。 試用向量搜索&#xff1a;使用這套自定進度的 Search AI 實操學習課程&#xff0c;親自體驗向量搜索。你可以開始免費云試用&#xff0c;或立即在本地機器上…

Java 14 新特性解析與代碼示例

Java 14 新特性解析與代碼示例 文章目錄Java 14 新特性解析與代碼示例1. 開關表達式&#xff08;Switch Expressions&#xff09;2. 記錄類型&#xff08;Records&#xff09;3. 文本塊&#xff08;Text Blocks&#xff09;4. instanceof的模式匹配&#xff08;Pattern Matchin…

在虛擬機ubuntu上修改framebuffer桌面不能顯示圖像

目錄 一、測試程序 二、排查原因 三、為什么 Xorg 會導致程序無法工作&#xff1f; 一、測試程序 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #in…

語言模型的評估指標整理

語言模型&#xff08;Language Models&#xff09;是自然語言處理&#xff08;NLP&#xff09;的核心組件&#xff0c;廣泛應用于機器翻譯、文本生成、對話系統等領域。隨著模型復雜度的提升&#xff0c;如何科學、系統地評估模型性能變得至關重要。評估指標不僅幫助我們理解模…

【開發技術】.Net中配置Serilog日志分級記錄

目錄 一、目的 二、解決方案 2.1 下載serilog包 2.2 Serilog配置 2.2.1 使用多個File sink配置不同的最小日志級別 2.2.2 使用Filter條件分流到不同文件 三、使用建議 四、文章總結 一、目的 在日常開發中&#xff0c;需要根據不同的場景去記錄日志&#xff0c;根據實際…

聊聊如何判斷發現的缺陷屬于前后端

目錄 一、觀察缺陷現象 二、檢查網絡請求&#xff08;核心方法&#xff09; 三、模擬請求驗證后端 四、查看日志 五、數據流分析 六、判斷前后端缺陷方法 判斷發現的缺陷是前后端&#xff0c;可以通過觀察缺陷現象&#xff0c;檢查網絡請求&#xff0c;查看后端日志&…

Python3與MySQL的PyMySQL連接與應用

Python3與MySQL的PyMySQL連接與應用 引言 隨著互聯網技術的飛速發展,數據庫在各個領域的應用日益廣泛。MySQL作為一種開源的關系型數據庫管理系統,因其穩定性和高效性,被廣泛應用于各種場景。Python作為一種高級編程語言,以其簡潔、易讀、易學等特點,受到了廣大開發者的…

智慧城市SaaS平臺|市政公用管理系統

【道路監測運維系統】1.數據可視化a) 實時監控支持對道路監測數據進行分析評估&#xff0c;為道路養護、交通管理、環境保護等提供數據支撐2.道路基礎設施監測支持對道路基礎設施的運行狀態進行實時監測&#xff0c;包括路面狀況3.交通流量監測支持對道路交通流量進行實時監測&…