完整架构

回顾

经过几年的发展,我的 API 平台从一个简单的天气查询服务,成长为一个完整的 API 平台。

现在,一次天气 API 请求不再只是简单地转发到外部服务。它会经过缓存、鉴权、调用记录、统计看板等多个环节,这条链路就是整个平台能力的缩影:

最终架构

核心组件

1. 负载均衡层

Nginx 集群(3 个地域,共 9 台)

  • 功能:负载均衡、SSL 终止、静态文件
  • 算法:加权轮询 + 健康检查
  • 容量:支持 10 万 QPS

2. 应用服务层

应用服务器(26 台)

  • 北京:10 台
  • 上海:8 台
  • 广州:8 台
  • 功能:API 处理、业务逻辑
  • 技术栈:轻量应用服务

3. 缓存层

Redis 集群(6 主 6 从)

  • 功能:热点数据缓存、限流计数
  • 容量:500GB
  • 命中率:95%+

4. 数据层

MySQL 集群(1 主 5 从)

  • 功能:用户数据、订阅、日志
  • 容量:2TB
  • 读写分离:主库写,从库读

5. 消息队列

RabbitMQ 集群(3 台)

  • 功能:异步任务、日志处理
  • 容量:100 万消息/分钟

关键技术决策

决策候选方案最终方案选择理由主要代价
负载均衡DNS 轮询、HAProxy、云负载均衡、NginxNginx能同时承担反向代理、健康检查、SSL 和静态资源入口,适合从单机平滑演进到多实例需要维护配置、健康检查和发布流程
缓存进程内缓存、MySQL 缓存表、RedisRedis + L1 本地缓存Redis 负责跨实例共享,L1 本地缓存保护热点数据和降低网络 RTT缓存一致性、失效策略和 Redis 高可用都要单独设计
数据库SQLite、MySQL、PostgreSQL、托管数据库MySQL 主从事务能力、运维经验和生态成熟,足够承载用户、订阅、日志和账单主从延迟、故障切换和读写路由需要持续治理
消息队列应用内队列、Redis Stream、RabbitMQ、KafkaRabbitMQ更重视任务可靠投递、确认和死信处理,吞吐要求还没到必须上 Kafka引入异步状态、重试、积压和失败补偿问题
任务调度cron、APScheduler、Celery、云流程APScheduler任务数量少时足够轻量,适合先验证缓存预热和定时清理多实例下要处理重复执行和任务漂移
多地域路由GeoDNS、HTTP 重定向、CDN、全局负载均衡GeoDNS + 应用层兜底接入成本低,可以先解决明显的跨地域访问延迟DNS 缓存导致故障切换不够实时
监控日志脚本、Prometheus + Grafana、云监控Prometheus + Grafana指标模型成熟,适合观察 QPS、延迟、错误率、队列积压和缓存命中率需要维护指标口径、告警阈值和看板
日志文件日志、MySQL 日志表、ELK StackELK Stack搜索、聚合和排障能力强,适合海量调用日志分析存储成本、索引设计和冷热分离复杂度上升
真实上线还要注意
  • 这些数字是案例规模。 10 万 QPS、2TB、100 万消息/分钟是为了帮助你理解架构层次,不是任何项目都能直接照抄。
  • 容量要从自己的数据算起。 真实上线前,要先看用户数、调用频率、缓存命中率和每条日志大小。
  • 架构不是越满越好。 如果你的平台还在早期,很多组件可以先不引入,等问题真的出现再演进。