aws-doc/课程/第六阶段-进阶与认证/第39天-实战项目设计.md
2026-05-08 10:24:39 +08:00

257 lines
7.7 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.

# 第39天实战项目——从零设计一个云原生应用
## 今天你将学到什么
今天是综合实战日。我们从零开始设计一个完整的云原生应用——"智能笔记"平台,综合运用前面学到的所有知识。这个练习帮你把零散的知识点串联成完整的架构思维。
---
## 项目需求
### 产品描述:智能笔记平台
一个支持 AI 辅助的笔记应用:
- 用户可以创建、编辑、组织笔记
- 支持图片和文件附件
- AI 功能:自动摘要、智能标签、相关笔记推荐
- 支持笔记分享和协作
- 支持全文搜索
- 移动端和 Web 端
### 非功能需求
| 需求 | 目标 |
|------|------|
| 可用性 | 99.9%(月停机 < 44 分钟 |
| 响应时间 | API P99 < 500ms |
| 用户规模 | 初期 1 万用户目标 100 万用户 |
| 数据安全 | 所有数据加密符合隐私法规 |
| 成本 | 初期月费 < $500 |
---
## 架构设计过程
### 第一步:识别核心功能模块
```
1. 用户管理(注册、登录、个人设置)
2. 笔记 CRUD创建、读取、更新、删除
3. 文件管理(上传、下载附件)
4. AI 处理(摘要、标签、推荐)
5. 搜索(全文搜索笔记内容)
6. 分享与协作(分享链接、协作编辑)
7. 通知新分享、AI 处理完成)
```
### 第二步:选择技术方案
| 模块 | 方案 | 原因 |
|------|------|------|
| 用户管理 | Cognito | 开箱即用支持社交登录免运维 |
| 笔记 API | API Gateway + Lambda | 无服务器按需付费初期成本低 |
| 笔记存储 | DynamoDB | 灵活 schema毫秒响应自动扩展 |
| 文件存储 | S3 | 无限容量便宜配合 CloudFront 加速 |
| AI 处理 | Lambda + SQS | 异步处理不阻塞用户操作 |
| 搜索 | OpenSearch Serverless | 全文搜索无服务器模式省钱 |
| 实时协作 | API Gateway WebSocket | 双向通信按连接付费 |
| 通知 | SNS + 移动推送 | 多渠道通知 |
| 前端托管 | S3 + CloudFront | 全球加速成本极低 |
### 第三步:画架构图
```
用户Web / 移动端)
CloudFront
├── 静态资源 → S3前端代码
└── API 请求 → API Gateway
┌─── Cognito 认证
Lambda 函数层
├── 笔记服务 → DynamoDB笔记数据
├── 文件服务 → S3附件+ 预签名 URL
├── 搜索服务 → OpenSearch
└── 分享服务 → DynamoDB分享关系
异步处理层:
DynamoDB Stream → Lambda → SQS → AI 处理 Lambda
├── 生成摘要(调用 AI API
├── 提取标签
└── 更新 DynamoDB + OpenSearch
实时协作:
API Gateway WebSocket → Lambda → DynamoDB + 连接管理
```
---
## 详细设计
### 数据模型DynamoDB
```
笔记表Notes
PK: USER#<userId>
SK: NOTE#<noteId>
属性title, content, tags, summary, createdAt, updatedAt
分享表Shares
PK: NOTE#<noteId>
SK: SHARE#<shareId>
属性sharedWith, permission, createdAt
全局二级索引GSI
GSI1: 按更新时间排序(获取最近编辑的笔记)
GSI2: 按标签查询(获取某个标签下的所有笔记)
```
### API 设计
| 方法 | 路径 | 功能 |
|------|------|------|
| POST | /notes | 创建笔记 |
| GET | /notes | 获取笔记列表 |
| GET | /notes/{id} | 获取单个笔记 |
| PUT | /notes/{id} | 更新笔记 |
| DELETE | /notes/{id} | 删除笔记 |
| POST | /notes/{id}/share | 分享笔记 |
| GET | /search?q=keyword | 搜索笔记 |
| POST | /upload | 获取文件上传 URL |
### 安全设计
```
认证Cognito JWT Token
授权Lambda 中验证用户只能访问自己的笔记
传输加密HTTPSCloudFront 强制)
存储加密DynamoDB + S3 使用 KMS 加密
密钥管理API 密钥存在 Secrets Manager
审计CloudTrail 记录所有 API 调用
```
### AI 处理流程Step Functions
```
笔记保存触发
DynamoDB Stream → Lambda判断是否需要 AI 处理)
Step Functions 工作流:
并行执行:
├── 生成摘要Lambda → AI API
├── 提取关键词标签Lambda → AI API
└── 计算相关笔记Lambda → OpenSearch
合并结果
更新 DynamoDB写入摘要、标签、推荐
通知用户"AI 处理完成"SNS → 推送)
```
---
## 运维设计
### 监控
```
CloudWatch Dashboard
├── API 指标:请求量、延迟、错误率
├── Lambda调用次数、执行时间、错误数
├── DynamoDB读写容量、延迟、节流次数
└── 业务指标:活跃用户数、笔记创建数
告警:
├── API 错误率 > 1% → 通知开发团队
├── Lambda 执行时间 > 5s → 通知
├── DynamoDB 节流 > 0 → 自动扩容
└── 月费用 > $400 → 通知
```
### CI/CD
```
GitHub → CodePipeline
├── 前端流水线:构建 → 部署到 S3 → 刷新 CloudFront 缓存
└── 后端流水线:测试 → 打包 → 部署 Lambda 函数SAM/CDK
```
---
## 成本估算(初期 1 万用户)
| 服务 | 用量估算 | 月费 |
|------|----------|------|
| Lambda | 500 万次调用 | $10 |
| API Gateway | 500 万次请求 | $17 |
| DynamoDB | 按需模式5GB 数据 | $25 |
| S3 | 50GB 文件 | $2 |
| CloudFront | 100GB 流量 | $9 |
| Cognito | 1 万用户 | $05 万内免费 |
| OpenSearch Serverless | 最小配置 | $175 |
| CloudWatch | 基本监控 | $10 |
| 其他 | Secrets ManagerKMS | $5 |
| **总计** | | **约 $253/月** |
满足 < $500 的预算要求随着用户增长DynamoDB Lambda 会自动扩展费用线性增长
---
## 扩展到 100 万用户
当用户从 1 万增长到 100 万时需要的调整
| 组件 | 调整 | 原因 |
|------|------|------|
| DynamoDB | 自动扩展无需操作 | 按需模式自动处理 |
| Lambda | 提高并发限制 | 默认 1000 并发可能不够 |
| OpenSearch | 增加容量 | 搜索量增大 |
| CloudFront | 无需调整 | 自动全球扩展 |
| 缓存 | 添加 DAX ElastiCache | 减少 DynamoDB 读取压力 |
| API Gateway | 无需调整 | 自动扩展 |
**无服务器架构的优势**大部分组件自动扩展不需要提前规划容量
---
## 从这个项目中学到什么
### 架构决策的思考过程
1. **先确定需求**功能需求 + 非功能需求
2. **选择架构风格**无服务器 vs 容器 vs 虚拟机
3. **为每个模块选择服务**根据特点匹配最合适的服务
4. **设计数据模型**根据访问模式选择数据库和表结构
5. **设计安全方案**认证授权加密审计
6. **设计运维方案**监控告警CI/CD
7. **估算成本**确保在预算内
8. **规划扩展**考虑未来增长
---
## 今天的小测验
1. 为什么这个项目选择无服务器架构而不是容器
2. AI 处理为什么要异步执行而不是同步
3. 为什么笔记数据用 DynamoDB 而不是 RDS
4. 如果搜索功能的成本太高有什么替代方案
---
## 延伸阅读
- [AWS 无服务器应用示例](https://serverlessland.com/)
- [DynamoDB 数据建模](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices.html)
- [AWS SAMServerless Application Model](https://docs.aws.amazon.com/serverless-application-model/)
---
## 明天预告
明天是最后一天持续学习指南了解学完这个课程后如何继续深入学习保持技术更新以及 AWS 社区资源