Files
zhixing-system/.trellis/tasks/archive/2026-08/08-11-market-sync-concurrency-storage/prd.md
T
2026-08-11 13:32:21 +08:00

2.5 KiB

实现八路同步与存储批量化

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 页面。
  • 不改变六年窗口、数据表业务字段或选股资格语义。