41 lines
2.5 KiB
Markdown
41 lines
2.5 KiB
Markdown
|
|
# 实现八路同步与存储批量化
|
||
|
|
|
||
|
|
## Goal
|
||
|
|
|
||
|
|
在不改变逐股六年 qfq、单股票事务/CSV 发布和覆盖率业务语义的前提下,把行情阶段从串行改为
|
||
|
|
默认 8 路受控并发,并消除 PostgreSQL 连接、审计写入和覆盖率查询的线性额外开销。
|
||
|
|
|
||
|
|
## Dependencies
|
||
|
|
|
||
|
|
- 无子任务依赖;本任务是完整性检查后端的前置任务。
|
||
|
|
|
||
|
|
## Requirements
|
||
|
|
|
||
|
|
- `ZHIXING_MARKET_DATA_MAX_WORKERS` 默认 8,CLI 实际传入同步用例;取值必须大于等于 1。
|
||
|
|
- bar worker 只处理一只股票并返回不可变 outcome,主线程负责计数、进度和批量审计。
|
||
|
|
- 所有 worker 共用 Tushare 请求协调器;真实 `daily` / `adj_factor` 调用能触发共享频控冷却,
|
||
|
|
正常流量不能被一个全局固定间隔重新串行化。
|
||
|
|
- 频控分类至少覆盖旧项目的中文提示、429 和 403;频控冷却默认 60/120/180 秒且可配置。
|
||
|
|
- 普通临时错误有界重试;数据验证错误不重试;所有日志安全且可统计等待时间。
|
||
|
|
- `pro_bar` 继续使用由 `pro_api(token)` 创建的 client,并保留 qfq 计算;内部隐藏重试不得绕开协调器。
|
||
|
|
- PostgreSQL 使用线程安全连接池,每个 worker 借独立连接完成单股票事务。
|
||
|
|
- `market_sync_item` 由主线程分批 upsert;覆盖率由一个集合查询计算。
|
||
|
|
- CLI 参数、退出码、失败重试、advisory lock、滚动清理和摘要字段保持兼容。
|
||
|
|
|
||
|
|
## Acceptance Criteria
|
||
|
|
|
||
|
|
- [ ] 并发测试证明默认/配置 worker 上限有效,5002 个 fake 股票不会创建 5002 个线程。
|
||
|
|
- [ ] 不同完成顺序得到相同汇总;单股票失败不影响其他股票,失败股票不发布临时 CSV。
|
||
|
|
- [ ] 一个 worker 命中频控后,其他 worker 在共享冷却截止前不启动新的真实供应商调用。
|
||
|
|
- [ ] `pro_bar` 的 `daily` 与 `adj_factor` 都经过请求协调器,token client 回归测试继续通过。
|
||
|
|
- [ ] PostgreSQL 集成测试覆盖多线程 upsert、事务回滚、批量 item 和集合覆盖率。
|
||
|
|
- [ ] 连接获取次数受池上限约束,覆盖率不再逐股票调用 `has_bar` / `has_daily_basic`。
|
||
|
|
- [ ] 同步用例、CLI 和 Tushare 单元测试通过;后端 Ruff、Pyright、pytest 全部通过。
|
||
|
|
- [ ] 无网络基准记录 5002 股票调度耗时、最大并发和 repository 调用数;生产 30 分钟目标标记为部署后验证。
|
||
|
|
|
||
|
|
## Out of Scope
|
||
|
|
|
||
|
|
- 不改成按交易日增量下载,不持久化 adj_factor。
|
||
|
|
- 不增加 HTTP 或 Web 页面。
|
||
|
|
- 不改变六年窗口、数据表业务字段或选股资格语义。
|