aws-doc/课程/第四阶段-应用架构/第32天-应用架构综合实战.md
2026-05-08 10:24:39 +08:00

248 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第32天应用架构综合实战——设计一个 SaaS 平台
## 今天你将学到什么
今天是第四阶段的收尾。我们用一个完整的 SaaS软件即服务平台案例把容器、CI/CD、API Gateway、Step Functions、微服务等知识串联起来。
---
## 项目背景:在线协作文档平台
假设你要做一个类似"腾讯文档"的简化版平台:
- 用户可以创建、编辑、分享文档
- 支持多人实时协作编辑
- 支持文档导出为 PDF
- 有团队管理和权限控制
- 需要支持百万级用户
---
## 整体架构
```
Web 前端 / 移动端
CloudFront静态资源 + API 加速)
API GatewayREST API 入口)
┌─────────────────────────────────────────────────┐
│ ECS Fargate 集群 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 用户服务 │ │ 文档服务 │ │ 团队服务 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 权限服务 │ │ 搜索服务 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ 数据层 │
│ Aurora用户、团队、权限
│ DynamoDB文档内容、版本历史
│ ElastiCache Redis会话、协作状态
│ S3文档附件、导出的 PDF
│ OpenSearch全文搜索
└─────────────────────────────────────────────────┘
异步处理:
EventBridge → Step Functions → Lambda
(文档导出、通知发送、数据分析)
实时协作:
API Gateway WebSocket → Lambda → DynamoDB + Redis
```
---
## 各服务职责
### 用户服务
- 注册、登录、个人信息管理
- 集成 Cognito 做身份认证
- 数据库Aurora用户表
### 文档服务
- 创建、读取、更新、删除文档
- 管理文档版本历史
- 数据库DynamoDB文档内容支持高频读写
### 团队服务
- 创建团队、邀请成员、管理角色
- 数据库Aurora团队和成员关系
### 权限服务
- 判断用户对某个文档有没有权限
- 缓存Redis权限判断需要极快响应
### 搜索服务
- 全文搜索文档内容和标题
- 引擎OpenSearchElasticsearch 托管版)
---
## 关键流程设计
### 流程一:用户编辑文档
```
1. 用户打开文档
→ API Gateway → 权限服务(检查权限)→ 文档服务(获取内容)
2. 用户编辑
→ WebSocket 连接 → Lambda → DynamoDB保存变更
→ Redis广播给其他协作者
3. 自动保存
→ 每 5 秒将变更批量写入 DynamoDB
→ 保留版本历史(最近 100 个版本)
```
### 流程二:文档导出 PDFStep Functions
```
用户点击"导出 PDF"
API Gateway → Lambda创建导出任务→ 返回任务 ID 给用户
Step Functions 工作流启动:
获取文档内容Task
渲染为 PDFTask可能需要 30 秒)
上传到 S3Task
生成下载链接Task
通知用户"PDF 已就绪"Task → SNS → 推送通知)
```
为什么用 Step Functions因为 PDF 渲染可能需要较长时间,不适合让用户同步等待。
### 流程三:新用户注册
```
用户注册
Cognito 创建用户
EventBridge 发布"用户注册"事件
├── Lambda创建默认工作空间
├── Lambda发送欢迎邮件SES
├── Lambda创建示例文档
└── Lambda记录注册统计
```
---
## CI/CD 流水线
```
开发者推送代码GitHub
CodePipeline 触发
CodeBuild
- 运行单元测试
- 构建 Docker 镜像
- 推送到 ECR
- 运行安全扫描
部署到 Staging 环境:
- 更新 ECS 服务
- 运行集成测试
- 运行 E2E 测试
人工审批(团队负责人确认)
部署到 Production
- ECS 蓝绿部署
- 金丝雀发布5% → 25% → 100%
- 自动回滚(如果错误率上升)
```
每个微服务有自己独立的流水线,可以独立部署。
---
## 扩展性设计
| 组件 | 扩展方式 | 触发条件 |
|------|----------|----------|
| ECS 服务 | 自动扩展任务数 | CPU > 70% 或请求队列增长 |
| DynamoDB | 自动扩展读写容量 | 使用率 > 70% |
| Aurora | 增加只读副本 | 读取延迟 > 100ms |
| Redis | 增加分片 | 内存使用 > 80% |
| Lambda | 自动(无需配置) | 并发请求增加 |
---
## 成本优化策略
| 策略 | 节省 | 实现方式 |
|------|------|----------|
| Fargate Spot | 最多 70% | 非关键服务使用 Spot 容量 |
| DynamoDB 按需模式 | 避免过度预置 | 流量不稳定的表用按需模式 |
| S3 生命周期 | 存储费用 | 30 天前的版本转到低频存储 |
| CloudFront 缓存 | 减少源站请求 | 静态资源缓存 24 小时 |
| Reserved Capacity | 最多 60% | Aurora 和 Redis 用预留实例 |
---
## 监控与告警
```
CloudWatch Dashboard统一视图
├── 业务指标活跃用户数、文档创建数、API 调用量
├── 性能指标API 延迟 P99、错误率、数据库连接数
├── 资源指标CPU、内存、磁盘使用率
└── 成本指标:每日花费、各服务占比
告警规则:
├── API 错误率 > 1% → 通知开发团队Slack
├── P99 延迟 > 2s → 通知运维团队
├── 数据库连接数 > 80% → 自动扩展 + 通知
└── 月度成本超预算 20% → 通知管理层
```
---
## 架构决策总结
| 决策 | 选择 | 原因 |
|------|------|------|
| 服务运行 | ECS Fargate | 不想管服务器,按需付费 |
| API 入口 | API Gateway | 统一认证、限流、监控 |
| 实时协作 | WebSocket + Redis | 低延迟双向通信 |
| 文档存储 | DynamoDB | 高频读写、灵活 schema |
| 用户数据 | Aurora | 关系型数据、复杂查询 |
| 异步处理 | EventBridge + Step Functions | 解耦、可视化、错误处理 |
| 搜索 | OpenSearch | 全文搜索、模糊匹配 |
| 部署 | 蓝绿 + 金丝雀 | 零停机、低风险 |
---
## 今天的小测验
1. 为什么文档内容用 DynamoDB 而不是 Aurora
2. 文档导出 PDF 为什么用 Step Functions 而不是同步处理?
3. 这个架构中,哪些部分可以独立扩展?
4. 如果某个微服务出了 bug对其他服务有什么影响
---
## 延伸阅读
- [AWS SaaS 架构指南](https://docs.aws.amazon.com/whitepapers/latest/saas-architecture-fundamentals/saas-architecture-fundamentals.html)
- [AWS 无服务器应用模型](https://docs.aws.amazon.com/serverless-application-model/)
- [AWS 架构中心](https://aws.amazon.com/architecture/)
---
## 明天预告
进入第五阶段:监控与运维。明天学习 CloudWatch——AWS 的监控核心。了解如何监控你的应用和基础设施,设置告警,在问题发生前就发现它。