易君召
发布于 2026-09-17 / 作者:易君召 / 2 阅读
0

请求响应时间缩短方案

请求响应时间(RT)一般由:客户端网络 → DNS → TCP 握手 → 服务端处理 → 数据库 / 中间件 IO → 网络回包 → 客户端渲染 多段组成,优化思路按「由外到内、先瓶颈后细节」。

公式:总RT = 网络耗时 + 服务处理耗时 + 下游依赖耗时 + 序列化/反序列化耗时

一、网络层优化(最容易感知到延迟)

  1. 缩短物理距离

    • 接入 CDN:静态资源(图片、JS、CSS、静态接口)就近节点缓存,减少跨地域访问。

    • 多活 / 就近接入:用户访问就近机房,避免跨城 / 跨洲长链路。

  2. 协议优化

    • HTTP/2 → HTTP/3(QUIC):多路复用,消除队头阻塞;QUIC 基于 UDP,握手更快,弱网友好。

    • 开启 TCP 参数调优:tcp_tw_reuse、调整缓冲区、BBR 拥塞控制(Linux)。

  3. 减少往返次数

    • 合并请求、资源合并;接口批量查询,避免串行多次调用。

    • 预连接(preconnect)、持久连接(Keep-Alive)复用 TCP 连接,减少重复握手。

  4. 压缩

    • 开启 gzip / Brotli 压缩响应体,减小包大小,降低传输耗时。

二、客户端 & 网关层优化

  1. 缓存

    • 浏览器缓存:Cache-Control、ETag、Last-Modified,静态资源强缓存,接口使用协商缓存。

    • 网关层缓存(Nginx/APISIX/Traefik):热点接口直接在网关返回,不打到后端服务。

  2. 网关限流 & 熔断 防止突增流量压垮后端,避免排队导致 RT 暴涨;超时设置合理,不要无限等待。

  3. DNS 优化

    • 用就近 DNS、DNS 预解析,降低 DNS 解析延迟;配置 TTL 合理,减少频繁解析。

三、应用服务层优化(Java/SpringBoot 这类业务服务重点)

  1. 减少串行等待,并行化

    • 多个独立下游调用:把串行调用改成并行(线程池 / CompletableFuture)。

    • 只查询必要字段,禁止select *

  2. 序列化优化

    • 替换 Jackson 为更快序列化:Hessian、Protobuf、FlatBuffers(接口协议升级)。

    • 减少返回字段,大对象懒加载,避免不必要对象创建。

  3. JVM 优化(Java)

    • 合理堆大小、选择低延迟 GC:ZGC / Shenandoah,减少 STW 停顿。

    • 消除热点锁、避免锁竞争;减少频繁创建短生命周期对象,降低 GC 压力。

  4. 线程模型

    • IO 密集型:异步非阻塞(WebFlux、Netty),避免 Tomcat 线程被 IO 阻塞排队。

    • 线程池参数合理,队列不要过大,防止请求堆积排队。

  5. 业务逻辑精简

    • 去掉不必要校验、日志(大量 debug 日志很耗性能)、冗余计算。

    • 大循环、复杂计算做预处理 / 预计算。

四、存储 & 中间件优化(大部分系统瓶颈在这里)

数据库

  1. 索引优化:建立合适 B + 树索引,避免全表扫描;防止索引失效(隐式转换、like 前缀模糊、函数操作)。

  2. 减少事务时长:小事务,不要长事务锁表;拆分大事务。

  3. 分页优化:避免 offset 大分页,使用主键游标分页。

  4. 读写分离:读请求走从库,主库只写。

  5. 分库分表:数据量巨大时,水平拆分,降低单表扫描压力。

缓存(Redis 为主)

  1. 热点数据前置到 Redis,把 DB 查询变成内存查询,极大降低 RT。

  2. 缓存策略:Cache-Aside;防缓存穿透、击穿、雪崩。

  3. Redis 本身优化:合理持久化(RDB/AOF)、集群就近访问、pipeline 批量命令,减少多次网络往返。

原则:能读缓存就不查库

消息队列

如果是同步接口,尽量不要同步等待 MQ 结果;异步化把长任务剥离出主链路,主请求快速返回。

五、架构层面根治长 RT

  1. 异步化:非强一致性的业务,主链路只做落库 + 发消息,后台异步处理,前端轮询 /websocket 拿结果,主请求 RT 大幅下降。

  2. 预计算:报表、统计、大盘数据,定时提前算好存入 Redis,请求直接读取结果,实时计算改离线预计算。

  3. 降级:非核心功能降级,保证核心链路低延迟。

  4. 服务拆分:避免单体大服务锁竞争、资源争抢;但是不要过度拆分,否则增加跨服务调用开销。

六、观测手段(先定位瓶颈,不要盲目优化)

  • 链路追踪:SkyWalking / Pinpoint / Jaeger,看每个阶段耗时,找到慢节点(网络 / DB / 下游)

  • 指标:P50/P95/P99 响应时间(看 P99,而不是平均值

  • 数据库慢 SQL、Redis 慢命令、线程 dump、GC 日志

优先级推荐(落地顺序)

  1. 先加链路追踪,定位瓶颈(不要猜)

  2. 热点数据增加缓存(收益最大)

  3. 慢 SQL 优化索引

  4. 并行化串行依赖调用

  5. 网络:CDN、压缩、HTTP2

  6. JVM、锁、序列化等代码层面微调


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/request-response-time-reduction-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/