记录今日遇到的四个典型后端问题,涵盖数据库迁移、浏览器并发限制、权限缓存、Nginx 代理配置。
1. MySQL 聚合过慢 → 迁移 ClickHouse
问题
接口中存在大量 foreach 循环聚合查询,随着数据量增长,MySQL 在多条件聚合场景下性能瓶颈明显,接口响应逐渐变慢。
解决
迁移至 ClickHouse,利用其列式存储和向量化执行引擎提升聚合性能。
迁移注意点
| 场景 | MySQL | ClickHouse |
|---|---|---|
| 去重计数 | COUNT(DISTINCT col) | uniq(col) |
| 分组聚合 | GROUP_CONCAT | groupArray() |
| 分页 | LIMIT offset, count | LIMIT count OFFSET offset |
| 保留字 | 一般无需处理 | user、date、index 等需加反引号 |
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 后,某鉴权服务全环境不可用。
排查链路:
- 数据库无异常
- 定位到 Nginx 配置变更
- 发现鉴权服务以
IP:port方式部署,未配置 SSL - 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 | 页面加载 12s | HTTP/1.1 并发连接上限 6 个 | Nginx 开启 HTTP/2 多路复用 |
| 3 | 运营接口全慢 | 权限节点每次请求均查库 | 节点检测结果加 1 分钟缓存 |
| 4 | 鉴权服务失效 | 上游无 SSL,HTTP/2 要求 TLS | 单独配置 proxy_http_version 1.1 |