实战阶段 I:今天我们将构建整个系统的“心脏”——Master 节点。它的核心要求是:高并发写入性能(对接无数个 Agent)和 数据安全性。我们将结合 Week 3 学到的 FastAPI 和 Pydantic 知识,打造一个工业级的后端服务。
学习内容 (30 mins)
在开始写代码前,先复习一下我们要用到的关键库,特别是异步数据库操作。1. 为什么必须用异步 (Async)? (10 mins)
1. 为什么必须用异步 (Async)? (10 mins)
Python 的性能瓶颈
- 同步 IO (Sync): 传统 Flask/Django 是阻塞的。当代码执行
db.query()时,整个线程都在傻等数据库返回,CPU 处于闲置状态。如果来了 1000 个请求,你的服务器就卡死了。 - 异步 IO (Async): 使用
async/await。当代码执行await db.execute()时,Python 会把控制权交还给事件循环 (Event Loop),去处理别人的请求。等数据库查好了,再像回调一样通知回来。 - Master 的场景: 我们是一个写密集型的应用,数据库 IO 是最大的瓶颈,所以必须用 Async。
2. SQLAlchemy Async 模式 (10 mins)
2. SQLAlchemy Async 模式 (10 mins)
现代 ORM 的写法
- 旧写法:
session.add(obj); session.commit() - 新写法:
session.add(obj); await session.commit() - 驱动变化: 我们不能再用
pymysql(它是同步的),而要换成aiomysql。
3. Pydantic 数据清洗 (10 mins)
3. Pydantic 数据清洗 (10 mins)
垃圾进,垃圾出 (GIGO)
- Agent 可能会发疯,上报 CPU = -50% 或者 CPU = 9999%,或者传个字符串过来。
- 如果我们不做校验直接存库,后续画图就会报错。
- Pydantic 作用: 在数据进入业务逻辑之前,像安检员一样,把不合格的数据直接挡回去 (Return 422)。
开发任务 (90 mins)
步骤 3: 核心 API 实现
编写 代码解释:
main.py,把所有模块串起来。async def report_metric(...):异步函数,支持高并发data: schemas.MetricReport:Pydantic 自动验证请求数据Depends(database.get_db):依赖注入,自动管理数据库会话await db.commit():异步提交,必须加 await
- IO 不阻塞:数据库操作时,线程可以去处理其他请求
- 高并发:一个线程可以处理多个请求,提高吞吐量
- 资源管理:依赖注入自动管理资源生命周期
- 启动 MySQL 容器 (回顾 Day 01)
- 运行服务:
python3 master/main.py - 打开浏览器访问
http://localhost:8000/docs(Swagger UI) - 测试 POST /api/v1/report:
- 如果返回
201且控制台打印了 INSERT SQL,说明成功! - 测试 GET /api/v1/top,应该能看到上报的数据
拓展任务 (30 mins)
查询优化
任务:目前的
/top 接口每次都查全表排序,效率极低。挑战:修改 SQL 查询,只查询 最近 1 分钟内 上报的数据中的 Top 5。- 提示:
from datetime import datetime, timedelta where(models.Metric.created_at > datetime.now() - timedelta(minutes=1))
结构优化
任务:将代码拆分到
routers/ 目录。挑战:把 API 路由逻辑从 main.py 移到 routers/metrics.py,保持 main.py 干净。这是大型项目的标准做法。今日产出物
database.py- 异步数据库连接models.py&schemas.py- 双层数据模型main.py- 核心 API 逻辑
参考代码
查看参考代码
GitHub 完整代码仓库
SQLAlchemy 异步指南
官方 AsyncIO 文档
实际应用场景
CMDB 资产管理
- 我们今天写的是动态监控。
- 其实稍微改改,增加一个
/register接口,让 Agent 启动时上报 CPU 型号、内存大小、OS 版本,这不就是一个简单的 CMDB (配置管理数据库) 吗?
上一阶段: 需求分析
Day 29 | 综合大项目需求分析
下一阶段: Agent 开发
Day 30 Pt.2 | 探针 Agent 开发