系统架构
Mirobody Health 采用模块化、分层架构,将关注点分离,并支持轻松扩展。核心组件
API 层
基于 FastAPI 的 REST API,用于对外集成
提供商系统
面向健康设备的可插拔 OAuth 集成
数据流水线
健康数据转换的 ETL 流水线
AI 服务
面向对话的多 LLM 提供商集成
MCP 协议
面向 AI agent 的 Model Context Protocol
存储层
PostgreSQL 与 Redis 用于数据持久化
架构分层
1. API 层
API 层为系统交互提供 RESTful 端点(endpoints):- 使用 FastAPI 进行异步请求处理
- 自动生成 API 文档(OpenAPI/Swagger)
- 为 Web 客户端提供 CORS 支持
- 使用 Pydantic 模型进行请求校验
- 基于 JWT 的身份验证
2. 提供商系统
面向健康设备集成的可插拔架构: 组件:BaseThetaProvider: 所有提供商的抽象基类ThetaDataFormatter: 标准数据转换工具ThetaTimeUtils: 时区和时间戳处理- 提供商特定实现(Garmin, Whoop 等)
3. 数据流水线 (TBD)
健康数据的 ETL(提取、转换、加载)流水线:- Pull (拉取):从厂商 API 获取数据
- Save (保存):将原始数据存入数据库
- Format (格式化):转换为标准格式
- Upload (上传):推送到 Mirobody 平台
4. AI 服务
面向智能健康洞察的多 LLM 提供商集成:- 与提供商无关的接口
- 对话上下文管理
- 用于健康数据访问的工具调用 (Tool calling)
- 会话历史持久化
5. MCP 协议
支持通过 Model Context Protocol 集成 AI agent:- JSON-RPC 2.0 接口
- 工具发现与执行
- 资源管理
- Agent 编排
6. 存储层
面向不同数据类型的双存储系统:- PostgreSQL
- Redis
用于:
- 用户凭据(加密)
- OAuth 令牌与刷新令牌
- 健康原始数据(JSONB)
- 提供商配置
- 会话历史
数据流
OAuth 身份验证流程
健康数据同步
设计模式
插件架构
提供商是动态发现并加载的:工厂模式
提供商使用工厂方法进行有条件的实例化:策略模式
针对 OAuth 1.0 vs 2.0 的不同 OAuth 策略:仓库模式
通过服务抽象数据库操作:安全架构
身份验证与授权
身份验证与授权
- 基于 JWT 的 API 身份验证
- 用于提供商访问的 OAuth 1.0/2.0
- 加密存储凭据
- 按用户隔离的提供商访问控制
数据保护
数据保护
- 数据库级别加密
- 加密 OAuth 令牌
- 所有外部通信使用 HTTPS
- 敏感数据绝不记录到日志
访问控制
访问控制
- 用户范围的数据访问
- 提供商特定的权限
- API 速率限制
- CORS 策略
安全通信
安全通信
- 外部 API 使用 TLS/SSL
- 针对 OAuth CSRF 保护的 state 参数
- 令牌刷新机制
- 安全的会话管理
可扩展性考虑
水平扩展
系统支持水平扩展:无状态 API
API 服务器是无状态的,可在负载均衡器后实现水平扩展
分布式缓存
Redis 支持集群,用于分布式缓存
数据库连接池
连接池支持多个 API 实例并发访问
异步处理
Async/await 提升了每个实例的并发处理能力
部署架构
Docker Compose 架构
监控与可观测性
日志
整个系统使用结构化日志:指标
追踪关键性能指标:- 请求延迟
- 提供商成功率
- 数据处理吞吐量
- 按提供商分类的错误率
- 令牌刷新率
健康检查
技术栈
- 后端
- 存储
- 集成
- DevOps
- Python 3.12+: 核心语言
- FastAPI: Web 框架
- asyncio: 异步 I/O
- Pydantic: 数据校验
- SQLAlchemy: 数据库 ORM
扩展点
该架构提供了多个扩展点:新增提供商
新增提供商
新增健康设备集成请参见开发:
自定义指标
自定义指标
添加新的健康指标:
- 在
StandardIndicator枚举中定义 - 指定标准单位
- 更新提供商映射
AI 提供商
AI 提供商
添加新的 LLM 提供商:
- 实现提供商接口
- 添加配置
- 在 agent 系统中注册
- 部署
最佳实践
关注点分离
每一层只负责单一职责
依赖注入
通过注入使用服务,而非硬编码
面向接口设计
面向接口编程,而非面向实现
配置驱动
行为通过配置控制
异步优先
所有 I/O 操作使用 Async/await
错误处理
优雅降级与恢复