做系统设计和架构决策时,即使和 AI 协作,这些"大件"的概念、适用场景、trade-off 必须自己掌握。
目录
一、计算层
解决"代码跑在哪里、怎么跑"的问题。
| 大件 | 是什么 | 什么时候用 | 你项目里的体现 |
|---|---|---|---|
| Web Server | 接收 HTTP 请求,返回响应(Nginx、Tomcat、Nitro) | 所有 Web 服务 | Nuxt Nitro(BFF)、Spring Boot 内嵌 Tomcat(Java) |
| 进程管理 | 管理应用进程的生命周期(PM2、systemd) | 需要多进程、自动重启 | PM2 Cluster × 4 个 Node.js 进程 |
| 任务调度 | 定时或触发式执行任务(Cron、Celery、XXL-Job) | 定时清理、定时报表 | 暂无,但 consumer 的消息消费本质上是事件驱动的任务调度 |
| Serverless / FaaS | 按请求付费,不管服务器(AWS Lambda、云函数) | 低频调用、事件驱动 | 暂无 |
核心概念:
- 同步 vs 异步:请求-响应是同步,消息驱动是异步
- 阻塞 vs 非阻塞:Node.js 事件循环是非阻塞,Java Servlet 是阻塞(每个请求一个线程)
- 水平扩展 vs 垂直扩展:加机器 vs 加配置
二、存储层
解决"数据存在哪里、怎么存"的问题。这是架构设计中最重要的决策之一。
| 大件 | 是什么 | 什么时候用 | 典型产品 |
|---|---|---|---|
| 关系型数据库 (RDBMS) | 结构化数据,支持事务和 JOIN | 业务数据、强一致性场景 | MySQL、PostgreSQL |
| OLAP 数据库 | 列式存储,擅长聚合分析 | 大数据量分析查询 | Doris、ClickHouse、Presto |
| NoSQL | 非关系型,灵活 schema | 高并发读写、文档/KV 存储 | MongoDB、DynamoDB、HBase |
| 对象存储 | 存文件(图片、视频、ZIP) | 大文件、静态资源 | S3、FDS、OSS、MinIO |
| 分布式文件系统 | POSIX 接口,像本地目录一样用 | 需要文件系统语义的大数据场景 | JuiceFS、HDFS、CephFS |
| 搜索引擎 | 全文检索、倒排索引 | 搜索、日志分析 | Elasticsearch、OpenSearch |
你项目里的选择:
- Doris:分析数据(列式存储,聚合查询快)
- FDS/S3:原始 ZIP 文件和结果文件
- Redis:缓存 + 分布式锁(见缓存层)
- 本地文件系统(PVC):trace-fs 挂载,consumer 解压临时文件
核心概念:
- OLTP vs OLAP:事务处理 vs 分析查询,选错数据库性能差 100 倍
- CAP 定理:一致性、可用性、分区容错性,三选二
- 读写分离:读多写少时主库写、从库读
- 分库分表 / 分区:数据量大了怎么拆
三、通信层
解决"服务之间怎么对话"的问题。
| 大件 | 是什么 | 什么时候用 | 典型产品 |
|---|---|---|---|
| HTTP/REST | 请求-响应,同步通信 | 前后端通信、服务间简单调用 | 所有 Web API |
| RPC | 远程过程调用,像调本地函数一样调远程服务 | 服务间高频同步调用 | gRPC、Dubbo、Thrift |
| 消息队列 (MQ) | 异步通信,生产者发消息,消费者取消息 | 异步解耦、削峰填谷、可靠投递 | Kafka、RabbitMQ、Talos、RocketMQ |
| WebSocket | 全双工长连接 | 实时推送(聊天、通知、行情) | 浏览器实时通信 |
| SSE | 服务端单向推送 | 服务端向浏览器推事件流 | ChatGPT 流式输出 |
MQ 的三大作用:
- 异步解耦:生产者不等消费者处理完
- 削峰填谷:突发流量先存 MQ,消费者按自己节奏处理
- 可靠投递:消费者挂了消息不丢,重启后继续消费
MQ 核心概念:
- at-most-once / at-least-once / exactly-once:消息投递语义
- Consumer Group:多个消费者共同消费一个 topic,实现水平扩展
- Offset / ACK:消费进度管理
- 死信队列 (DLQ):消费失败多次后的兜底
- 拉模式 vs 推模式:Kafka 拉(consumer 控制节奏),RabbitMQ 推(broker 主动投递)
你项目里的体现:
- HTTP:前端 → Java 后端 API
- MQ(Talos):Java 后端 → Python consumer(异步解耦上传和解析)
- 自定义 TCP:Python → pmc server(socket 通信)
四、缓存层
解决"怎么让热数据访问更快"的问题。
| 大件 | 是什么 | 什么时候用 | 典型产品 |
|---|---|---|---|
| 内存缓存 | KV 存储,微秒级读写 | 热数据缓存、会话存储 | Redis、Memcached |
| 本地缓存 | 进程内缓存 | 极高频读取、不需要跨进程共享 | Guava Cache、Caffeine、Map |
| CDN | 边缘节点缓存静态资源 | 静态文件加速(JS/CSS/图片) | CloudFront、Akamai |
| 浏览器缓存 | 客户端缓存 | 减少重复请求 | HTTP Cache-Control、IndexedDB |
Redis 的常见用法:
- 缓存:查询结果缓存,减少数据库压力
- 分布式锁:
SET NX+ TTL,防止多进程重复计算 - Pub/Sub:进程间通知
- 计数器/限流:接口限流、访问计数
- 会话存储:用户登录状态
核心概念:
- 缓存穿透:查不存在的数据,每次都打到数据库 → 布隆过滤器
- 缓存击穿:热 key 过期瞬间大量请求打到数据库 → 互斥锁
- 缓存雪崩:大量 key 同时过期 → 过期时间加随机值
- 缓存一致性:数据库更新了缓存没更新 → Cache Aside 模式
你项目里的体现:
- Redis 分布式锁:PM2 多进程防重复计算
- Redis Pub/Sub:进程间通知解析完成
- IndexedDB:前端大数据量缓存(火焰图几十 MB 数据)
五、网关与流量层
解决"流量怎么进来、怎么分发"的问题。
| 大件 | 是什么 | 什么时候用 | 典型产品 |
|---|---|---|---|
| 反向代理 | 接收外部请求,转发到内部服务 | 所有 Web 服务的入口 | Nginx、HAProxy |
| API 网关 | 统一入口,认证/限流/路由 | 微服务架构 | Kong、APISIX、Spring Cloud Gateway |
| 负载均衡 | 把请求分发到多个后端实例 | 多实例部署 | Nginx、K8s Service、ALB |
| Ingress | K8s 的外部流量入口 | K8s 环境 | Nginx Ingress、Traefik |
核心概念:
- 正向代理 vs 反向代理:正向代理代表客户端,反向代理代表服务端
- 负载均衡策略:轮询、加权、最少连接、一致性哈希
- 限流:令牌桶、滑动窗口
- 熔断:下游挂了快速失败,不拖垮上游
你项目里的体现:
- Nginx:前端静态资源 + API 反向代理
- K8s Ingress:
test.loadterminator.mioffice.cn→ Service → Pod - Nuxt devProxy:开发环境代理
/dfp-api/*到 Java 后端
六、可观测性
解决"系统出问题了怎么发现、怎么排查"的问题。
| 大件 | 是什么 | 什么时候用 |
|---|---|---|
| 日志 (Logging) | 记录事件和错误 | 所有服务,排查问题的第一手资料 |
| 指标 (Metrics) | 数值型监控数据(QPS、延迟、错误率) | 告警、容量规划、性能分析 |
| 链路追踪 (Tracing) | 一个请求经过的所有服务节点 | 微服务架构下定位慢请求 |
| 告警 (Alerting) | 指标异常时通知 | 线上故障及时发现 |
核心概念:
- 三大支柱:Logging + Metrics + Tracing = 可观测性
- 结构化日志:JSON 格式,方便搜索和聚合
- Trace ID:一个请求的唯一标识,贯穿所有服务
- SLI/SLO/SLA:服务质量指标/目标/协议
七、容器与编排
解决"怎么打包、部署、扩缩容"的问题。
| 大件 | 是什么 | 什么时候用 |
|---|---|---|
| Docker | 容器化,把应用和环境打包在一起 | 所有现代部署 |
| K8s | 容器编排,管理容器的生命周期 | 多实例、自动扩缩容、滚动更新 |
| CI/CD | 自动化构建、测试、部署 | 所有项目 |
| 镜像仓库 | 存储 Docker 镜像 | 镜像分发 |
K8s 核心概念:
- Pod:最小部署单元,一个或多个容器
- Deployment:管理 Pod 的副本数和更新策略
- Service:Pod 的稳定访问入口(负载均衡)
- PVC:持久化存储卷
- ConfigMap / Secret:配置和密钥管理
- HPA:根据 CPU/内存自动扩缩容
你项目里的体现:
- Docker:多阶段构建(base 镜像 + 应用镜像)
- K8s:Deployment + Service + Ingress + PVC
- CI/CD:GitLab CI + Kaniko(无 Docker daemon 构建)
- PVC:
/home/work/trace-fs持久化挂载
八、安全
解决"怎么防止被攻击、数据泄露"的问题。
| 大件 | 是什么 | 什么时候用 |
|---|---|---|
| 认证 (AuthN) | 你是谁(登录) | 所有需要身份识别的系统 |
| 授权 (AuthZ) | 你能做什么(权限) | 需要角色/权限控制的系统 |
| HTTPS/TLS | 传输加密 | 所有生产环境 |
| CORS | 跨域资源共享 | 前端直传对象存储、跨域 API |
| 预签名 URL | 临时授权访问 | 前端直传文件到对象存储 |
核心概念:
- SSO:单点登录,一次登录多个系统
- JWT / Token:无状态认证
- OAuth 2.0:第三方授权
- RBAC:基于角色的访问控制
- SQL 注入 / XSS / CSRF:常见攻击手段和防护
- 路径穿越:文件访问接口的安全防护
你项目里的体现:
- Aegis SSO:公司统一认证
- RSA-SHA256 签名验证:BFF 层验证用户身份
- Presigned URL:前端直传 FDS,后端只做签名不承受流量
- 路径穿越防护:
path.contains("..")检查 - 参数化查询:防 SQL 注入
九、你的项目中用了哪些
一张图看全貌:
┌─ 流量层 ─────────────────────────────────┐
│ Nginx (反向代理) → K8s Ingress │
├─ 计算层 ─────────────────────────────────┤
│ Nuxt BFF (PM2 × 4) │
│ Java Spring Boot (Tomcat) │
│ Python Consumer │
│ C++ pmc server │
├─ 通信层 ─────────────────────────────────┤
│ HTTP/REST (前后端通信) │
│ Talos MQ (异步解耦) │
│ 自定义 TCP (pmc socket) │
├─ 缓存层 ─────────────────────────────────┤
│ Redis (分布式锁 + Pub/Sub) │
│ IndexedDB (前端大数据缓存) │
├─ 存储层 ─────────────────────────────────┤
│ Doris (OLAP 分析数据) │
│ FDS/S3 (对象存储) │
│ PVC (本地持久化) │
├─ 安全层 ─────────────────────────────────┤
│ Aegis SSO + RSA 签名验证 │
│ Presigned URL + CORS │
├─ 部署层 ─────────────────────────────────┤
│ Docker + K8s + GitLab CI + Kaniko │
└──────────────────────────────────────────┘
讲清楚每层为什么选这个、trade-off 是什么,就是架构师的水平。