# 设计模式参考

常见架构模式和设计决策参考，用于方案探索阶段。

---

## 架构模式

### 单体应用 (Monolith)

**适用场景:**
- 小型项目/初创阶段
- 团队规模 < 5人
- 快速迭代需求
- 业务逻辑相对简单

**优点:**
- 开发部署简单
- 调试方便
- 无网络延迟
- 事务处理简单

**缺点:**
- 难以水平扩展
- 代码耦合风险
- 技术栈受限
- 单点故障

---

### 微服务 (Microservices)

**适用场景:**
- 大型复杂系统
- 多团队协作
- 需要独立扩展
- 不同模块技术栈不同

**优点:**
- 独立部署和扩展
- 技术选型灵活
- 故障隔离
- 团队自治

**缺点:**
- 运维复杂度高
- 分布式问题（一致性、网络）
- 调试困难
- 初期成本高

---

### 事件驱动 (Event-Driven)

**适用场景:**
- 异步处理需求
- 系统解耦
- 数据同步/通知
- 实时响应

**优点:**
- 松耦合
- 异步非阻塞
- 易于扩展
- 天然支持审计日志

**缺点:**
- 调试复杂
- 消息顺序问题
- 需要消息中间件
- 事件溯源复杂

---

### 分层架构 (Layered)

**适用场景:**
- 传统企业应用
- CRUD 密集型
- 团队熟悉度高

**典型分层:**
```
表现层 (Presentation)
    ↓
业务逻辑层 (Business Logic)
    ↓
数据访问层 (Data Access)
    ↓
数据层 (Database)
```

**优点:**
- 结构清晰
- 易于理解和维护
- 标准化程度高

**缺点:**
- 可能过度抽象
- 层间传递开销
- 不适合复杂业务

---

## 数据存储模式

### 关系型数据库 (RDBMS)

**选择依据:**
- 数据关系复杂
- 需要 ACID 事务
- 查询模式多变
- 数据一致性要求高

**常见选择:** PostgreSQL, MySQL

---

### 文档数据库 (Document DB)

**选择依据:**
- 数据结构灵活
- 嵌套数据常见
- 水平扩展需求
- JSON 原生支持

**常见选择:** MongoDB, CouchDB

---

### 键值存储 (Key-Value)

**选择依据:**
- 简单读写
- 高性能要求
- 缓存场景
- 会话存储

**常见选择:** Redis, DynamoDB

---

### 时序数据库 (Time-Series)

**选择依据:**
- 监控/日志数据
- IoT 传感器数据
- 金融时序数据
- 大量写入，少量读取

**常见选择:** InfluxDB, TimescaleDB

---

## API 设计模式

### RESTful API

**适用场景:**
- 资源导向的 CRUD 操作
- 标准化要求
- 公开 API

**设计要点:**
- 使用 HTTP 方法语义
- 资源命名用复数
- 版本控制
- 分页/过滤/排序

---

### GraphQL

**适用场景:**
- 复杂数据关系
- 客户端需要灵活查询
- 减少请求次数
- 多数据源聚合

**优点:**
- 单次请求获取所需数据
- 强类型 Schema
- 自文档化

**缺点:**
- 学习曲线
- 缓存复杂
- 可能的 N+1 查询

---

### gRPC

**适用场景:**
- 服务间通信
- 高性能要求
- 强类型契约
- 流式传输

**优点:**
- 二进制协议，高效
- 双向流
- 代码生成

**缺点:**
- 浏览器支持有限
- 调试不如 REST 直观

---

## 缓存策略

### 缓存位置选择

| 位置 | 适用场景 |
|------|----------|
| 浏览器/客户端 | 静态资源、不常变数据 |
| CDN | 静态资源、地理分布 |
| 应用内存 | 计算结果、配置 |
| Redis/Memcached | 共享数据、分布式 |
| 数据库 | 查询结果 |

### 缓存模式

```
Cache-Aside (旁路缓存):
1. 先查缓存
2. 未命中则查数据库
3. 写入缓存后返回

Write-Through (写穿透):
1. 写入缓存
2. 同时写入数据库

Write-Behind (写回):
1. 写入缓存
2. 异步写入数据库
```

---

## 部署模式

### 容器化 (Docker)

**适用场景:**
- 环境一致性要求
- 微服务架构
- CI/CD 自动化

**优点:**
- 环境隔离
- 快速部署
- 资源利用高效

---

### Serverless

**适用场景:**
- 流量波动大
- 事件触发场景
- 快速原型

**优点:**
- 无服务器管理
- 按需付费
- 自动扩展

**缺点:**
- 冷启动延迟
- 调试困难
- 厂商锁定风险

---

## 决策矩阵

根据项目特征快速选择模式：

| 项目特征 | 推荐架构 | 数据存储 | API 风格 |
|----------|----------|----------|----------|
| 小型 MVP | 单体 | PostgreSQL | REST |
| 中型产品 | 分层单体 | PostgreSQL + Redis | REST |
| 大型平台 | 微服务 | 混合数据库 | REST + gRPC |
| 实时系统 | 事件驱动 | Redis + 时序DB | WebSocket |
| 移动后端 | 单体/BFF | PostgreSQL | GraphQL |
