一次 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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.交通流量监测支持对道路交通流量进行实时监测&…