响应太慢

火了,但也慢了

我的 API 在社区里火了。

用户开始抱怨:

  • “你的 API 太慢了!”
  • “有时候要等 3 秒才能返回”
  • “能不能优化一下?”

每一条反馈我都看在眼里。那时候的我意识到:再不优化,这个产品就真的要死了。

调查

我决定调查问题原因。首先加了日志,记录每个请求的时间分布,然后在管理后台界面直观的展示出来。

运行一天后,我查看管理后台:

请求耗时分析

一次天气查询为什么要等 2 秒?

总耗时
2000ms
外部 API 调用 1800ms
主要等待点
网络开销 150ms
可优化但不是主因
数据处理 50ms
平台内部开销较低
耗时占比
外部 API 调用:90%
网络开销:7.5%
数据处理:2.5%

瓶颈找到了:外部 API 太慢!

更糟糕的消息

我查了一下外部 API 的文档,发现:

https://weather-api.com/docs/pricing-and-limits

免费版限制

  • 每分钟调用次数:100 次
  • 每天调用次数:10000 次

计算一下当前使用情况:

  • 日调用量:10 万次
  • 每分钟平均:10 万 / 24 / 60 ≈ 70 次/分钟

已经接近限制了!如果用户再增长,就会被限流。

那一刻我真的慌了。

思考

关键问题:同一个城市的天气,多久变化一次?

我查了一下气象数据:

  • 温度:每小时变化 1-3 度
  • 天气状况:几小时内基本不变
  • 湿度:变化缓慢

结论:同一个城市,1 小时内的天气数据基本相同!

那为什么要重复调用?

数据分析

我分析了过去 24 小时的请求日志:

请求数据分析:

  • 总请求数:100,000 次
  • 不同城市数:50 个
  • 平均每个城市:2000 次请求/天

最热门的城市:

  • 北京:15000 次
  • 上海:12000 次
  • 深圳:10000 次

如果北京在 1 小时内被请求了 1500 次,我调用了 1500 次外部 API,但返回的是同样的数据

这是巨大的浪费!

解决思路

我应该将数据缓存下来。

核心思想:

  • 第一次请求:调用外部 API,缓存结果
  • 后续请求:直接返回缓存,不调用外部 API
  • 缓存过期:1 小时后自动失效