← 每日面试题 学习看板

服务端接口性能优化有哪些方案?

面试题/02架构设计题/03高性能/服务端接口性能优化有哪些方案?.md

面试记录 2026-10-08

题目:服务端接口性能优化有哪些方案?

难度:high

标签:arch/high-performance, architecture/high-performance, difficulty/high

评分:⭐⭐⭐⭐☆(4/5)

我的回答

服务端接口性能优化。首先你需要考虑接口需要优化吗?这个接口性能存在问题吗?它使用的场景是什么样子?确认它需要达到什么样的指标?确认完这些之后,才去考虑优化性能的方案。

常规的包括,如果可以异步,首先是异步去处理这些里边耗时的东西,然后加缓存,如果能接受一定时间的不一致,就加缓存。这个数据存在于缓存,与去从数据库中拿,效率肯定是不一样的。然后如果对缓存的并发量还是有要求的话,可能远程缓存不行,还需要加二层的本地缓存。降低远程访问的使用。数据库层面的优化包括可以做数据库的拆分,数据库 SQL 的优化。基本上是这些方案。

细化下,从上面,最上面应该是网络层,就近访问。设置就近的资源中心服务器,就近访问。然后中间层到数据分流,不要把所有的流量打到一个服务器上,而是做好均分,均分到不同的服务器。然后再往下是接口层面的,是在接口层增加缓存。增加缓存可能是,如果流量足够高,可能要加本地缓存。然后二级的本地缓存,一级的远程缓存。然后都防没有,然后再去打数据库。然后数据库层面的优化是,首先是 SQL 本身的优化,性能优化,索引。使用覆盖索引,降低数量返回等等。然后如果是三方调用,三方调用的话做异步,然后异步的然后进行数据在组侧进行组装,将多个服务的数据进行组装,异步的进行组装。然后是数据库层面还可以进行,如果数据量比较大,做分库分表,这些操作,或者说选择不同的数据库介质。比如,如果关系型数据库不行,是否可以用像 ClickHouse、ES 这些大的数据库模型去进行数据库处理。

点评

优点:前置判断极佳(先定位瓶颈再优化);分层清晰(网络→负载均衡→接口→缓存→数据库);方案具体(异步/多级缓存/覆盖索引/分库分表/换技术栈/异步组装);有工程思维(业务权衡、就近访问、扩展性)。

不足:遗漏代码级优化(N+1 查询、批处理、并行流);遗漏基础设施调优(JVM/GC、线程池、连接池);遗漏可观测性(链路追踪、性能监控);遗漏兜底策略(限流/熔断/降级/预热);遗漏传输层(gzip/HTTP2/gRPC/CDN)。

补充:性能优化五步法——定位瓶颈(链路追踪+火焰图)→ 代码优化(N+1/批处理/并行)→ 缓存优化(多级/预热/穿透防护)→ 基础设施(JVM/线程池/连接池)→ 架构演进(分库分表/CQRS/读写分离);不同数据库适用场景:MySQL 事务/ClickHouse OLAP/ES 搜索/HBase 海量 KV。

完整讲解

第一部分:知识重点剖析

核心考点定位:考察性能优化的系统性思维——不是罗列方案,而是能系统分层、量化目标、兜底保护。

知识点拆解:

  1. 前置判断(用户抓准了这个):
  1. 五步法(覆盖用户提到的所有维度 + 补充遗漏项):

Step 1:定位瓶颈

Step 2:代码级优化(用户遗漏)

Step 3:缓存优化(用户提到)

Step 4:基础设施调优(用户遗漏)

Step 5:架构演进(用户提到)

  1. 兜底策略(用户遗漏,非常重要):
  1. 不同数据库适用场景(用户提到但未展开):
数据库适用场景
MySQL事务、强一致、中等数据量
ClickHouseOLAP 分析、海量聚合查询、列存
Elasticsearch全文搜索、复杂查询、日志
HBase宽表、海量 KV、非结构化
Redis缓存、实时排行、分布式锁
MongoDB文档型、灵活 Schema
按「前置判断 → 五步法 → 兜底策略 → 技术选型」递进。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 如何定位一个慢接口的瓶颈?给一个具体的排查流程。
  1. CompletableFuture 并行调用多个下游服务,需要注意什么?
  1. 压测如何避免影响线上用户?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,性能优化我会按五步法来:

Step 0:前置判断——优化前必须先定位瓶颈,不要盲改代码。要看链路追踪(SkyWalking/Jaeger)看哪个 span 慢,看火焰图看 CPU 热点,看慢 SQL 日志、APM 指标(RT/QPS/错误率)。同时明确业务指标(QPS/P99 响应/并发)和优化目标(如 P99 从 500ms 降到 100ms),避免过度优化。

Step 1:代码级优化——

Step 2:缓存优化——

Step 3:基础设施调优——

Step 4:架构演进——

Step 5:兜底策略——

举例——我在项目里做过一个订单查询接口优化,一开始 P99 是 800ms:

  1. 定位:链路追踪发现是 N+1 查询(一次查订单触发 100+ 次查商品);
  2. 优化:改成 JOIN + 本地缓存商品数据;
  3. 调优:调大 HikariCP 连接池、G1 GC 调参;
  4. 兜底:加 Redis 缓存兜底、Sentinel 限流;
  5. 压测:JMeter 压测前后 P99 从 800ms → 120ms,QPS 从 500 → 3000。

总结:性能优化不是"堆代码",而是"先定位 → 再优化 → 后兜底 → 量化验证"的四步闭环。核心是权衡成本 vs 收益——不是所有慢接口都值得优化,先明确业务指标再动手。