FQBase - 设计原则
阅读路径
🟠🔵 架构师+开发者:README → design → architecture → patterns → development
设计原则
| 原则 | 应用 |
|---|---|
| SOLID | 贯穿整个设计 |
| DRY | 提取共享工具 |
| KISS | 简单专注的组件 |
| 单一职责 | 每个模块职责明确 |
| 开闭原则 | 对扩展开放,对修改封闭 |
设计决策记录
决策 1: 分层架构
日期: 2025-06-01 状态: 已通过
上下文: 需要为 FQuant 项目提供统一的基础设施
选项分析:
| 选项 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 单一模块 | 简单 | 职责混淆 | 小型项目 |
| 分层架构 | 职责清晰、易维护 | 增加复杂度 | 中大型项目 |
决策: 采用分层架构
理由: FQuant 是量化交易框架,基础设施层和业务层需要清晰分离,便于维护和测试。
后果:
- 正面:模块职责清晰,易于维护
- 负面:增加了一定的学习成本
决策 2: 单例模式 vs 依赖注入
日期: 2025-08-15 状态: 已通过
上下文: 需要管理全局共享资源(数据库连接、缓存等)
选项分析:
| 选项 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 单例模式 | 简单直接 | 难以测试、隐式依赖 | 资源管理 |
| 依赖注入 | 可测试、显式依赖 | 需要容器 | 业务对象 |
决策: 两种模式并存
理由:
- 基础设施层使用单例(数据库连接、缓存)
- 业务对象使用依赖注入(便于测试)
后果:
- 正面:兼顾简单性和可测试性
- 负面:两种模式需要开发者理解
决策 3: 缓存后端选择
日期: 2025-10-01 状态: 已通过
上下文: 需要提供多级缓存支持
选项分析:
| 选项 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 仅 Redis | 简单 | 分布式部署复杂 | 小规模 |
| 多级缓存 | 灵活 | 增加复杂度 | 中大规模 |
决策: 支持 LocalMemory + Redis + MongoDB 三级缓存
理由: 不同部署场景需要不同的缓存策略,开发环境用内存,生产环境用 Redis。
后果:
- 正面:灵活适应各种场景
- 负面:缓存一致性问题需要开发者注意
技术权衡
权衡 1: 同步 vs 异步事件处理
考量因素:
| 因素 | 同步处理 | 异步处理 |
|---|---|---|
| 性能 | 低 | 高 |
| 复杂度 | 低 | 高 |
| 可靠性 | 高 | 中 |
| 调试难度 | 低 | 高 |
决策: 默认同步,支持异步(Celery)
后果:
- 正面:简单场景直接使用,复杂场景可扩展
- 负面:需要开发者理解两种模式
权衡 2: 熔断器阈值
考量因素:
| 因素 | 低阈值(3次) | 高阈值(10次) |
|---|---|---|
| 敏感性 | 高,快速熔断 | 低,可能积累失败 |
| 可用性 | 可能过度熔断 | 可能雪崩 |
决策: 默认 5 次,支持自定义
后果:
- 正面:大多数场景适用
- 负面:特定场景可能需要调优
选型决策树
需要使用 FQBase 吗?
│
├── 需要基础设施吗?
│ ├── 是 ──▶ 需要什么?
│ │ ├── 日志/异常 ──▶ Infrastructure
│ │ ├── 事件通信 ──▶ Foundation
│ │ ├── 配置管理 ──▶ Config
│ │ ├── 缓存 ──▶ Cache
│ │ ├── 数据库 ──▶ DataStore
│ │ └── 爬虫 ──▶ Crawler
│ └── 否 ──▶ 考虑其他方案
│
└── 需要组合使用多个模块吗?
├── 是 ──▶ 使用组合导入
└── 否 ──▶ 按需单独导入扩展点
| 扩展点 | 方法 | 描述 |
|---|---|---|
| 自定义缓存后端 | register_cache_adapter | 注册新的缓存适配器 |
| 自定义通知渠道 | 继承 NotificationHandler | 添加新的通知方式 |
| 自定义事件处理 | 实现 EventHandler | 添加异步事件处理 |
反模式警示
错误示例
python
# 在业务层直接使用 pymongo
from pymongo import MongoClient
client = MongoClient("mongodb://...")
db = client["mydb"]正确做法
python
# 使用 DataStore 门面
from FQBase.DataStore import get_mongo_db
db = get_mongo_db()
db.insert_one("collection", {"data": "value"})使用的模式
| 模式 | 位置 | 用途 |
|---|---|---|
| 单例模式 | Infrastructure/singleton.py | 全局实例管理 |
| 门面模式 | DataStore/mongo_db.py | 简化 MongoDB 操作 |
| 适配器模式 | Cache/CacheAdapters.py | 统一缓存接口 |
| 装饰器模式 | Infrastructure/retry.py | 重试机制 |
| 观察者模式 | Foundation/event_bus.py | 事件通信 |
| 工厂模式 | Cache/init.py | 缓存创建 |