Karp 的技术博客
记录今日遇到的四个典型后端问题,涵盖数据库迁移、浏览器并发限制、权限缓存、Nginx 代理配置。

1. MySQL 聚合过慢 → 迁移 ClickHouse

问题

接口中存在大量 foreach 循环聚合查询,随着数据量增长,MySQL 在多条件聚合场景下性能瓶颈明显,接口响应逐渐变慢。

解决

迁移至 ClickHouse,利用其列式存储和向量化执行引擎提升聚合性能。

迁移注意点

场景MySQLClickHouse
去重计数COUNT(DISTINCT col)uniq(col)
分组聚合GROUP_CONCATgroupArray()
分页LIMIT offset, countLIMIT count OFFSET offset
保留字一般无需处理userdateindex 等需加反引号

2. 接口耗时 5s,页面显示 12s → HTTP/1.1 并发限制

问题

页面同时发起十几个接口请求。HTTP/1.1 每个域名最多维持 6 个并行连接,其余请求在队列中等待。某个连接完成后,队列里的下一个才能发出。接口本身耗时 5s,但因后续接口需等待前面的连接 slot 释放,页面整体加载耗时达到 12s。

HTTP/1.1 连接模型:

请求队列:[ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ] | [ 7 ][ 8 ][ 9 ]...
                 ↑ 同时发出(最多 6 个)        ↑ 等待 slot 释放

解决

Nginx 开启 HTTP/2。HTTP/2 通过多路复用在单个 TCP 连接上并发处理所有请求,不再受 6 个并行上限限制,先处理完的先返回,互不阻塞,页面加载时间降至接近单个接口耗时。

server {
    listen 443 ssl http2;
    ...
}

3. 运营接口全部比技术慢 → 权限节点未缓存

问题

技术账号是超级管理员,跳过权限节点检测;运营账号权限节点数量多,每次请求都做完整的节点验证,导致运营侧所有接口响应明显慢于技术侧。

解决

对权限节点检测结果增加缓存:

  • 缓存时长:1 分钟
  • 节点有效期:10 分钟
  • 缓存 key:需包含用户 ID,避免不同账号共享权限缓存
  • 缓存失效:更新权限后主动删除对应缓存;账号被禁用时同样需要清除
请求 → 查缓存(hit)→ 直接通过,耗时极低
请求 → 查缓存(miss)→ 查库验证 → 写入缓存
更新权限 → 主动删除缓存

4. 批量开启 HTTP/2 后鉴权服务全部失效

问题

批量为 Nginx 开启 HTTP/2 后,某鉴权服务全环境不可用。

排查链路:

  1. 数据库无异常
  2. 定位到 Nginx 配置变更
  3. 发现鉴权服务以 IP:port 方式部署,未配置 SSL
  4. Nginx 与该上游的通信被升级为 HTTP/2,HTTP/2 要求上游支持 TLS,鉴权服务无法完成握手,连接失败
需要区分两段链路:浏览器 → Nginx 走 HTTP/2(需要 TLS);Nginx → 上游服务 默认走 HTTP/1.1,若显式或批量配置为 HTTP/2,则上游同样需要支持 TLS。内网 IP:port 部署的服务往往没有证书,批量升级时容易踩这个坑。

解决

对该上游服务的 proxy 单独指定 HTTP/1.1,与其他服务隔离:

location /auth {
    proxy_pass http://auth-service;
    proxy_http_version 1.1;
}

小结

#现象根因解决方向
1聚合接口慢MySQL foreach 聚合性能瓶颈迁移 ClickHouse,注意语法差异
2页面加载 12sHTTP/1.1 并发连接上限 6 个Nginx 开启 HTTP/2 多路复用
3运营接口全慢权限节点每次请求均查库节点检测结果加 1 分钟缓存
4鉴权服务失效上游无 SSL,HTTP/2 要求 TLS单独配置 proxy_http_version 1.1

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2026年04月13日 08:45
0

目录

来自 《[踩坑] 后端性能优化:一天排查的 4 个问题》