ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

tick-stock-panel 实时行情流架构:档位节流、订阅池与盘中突发故障隔离,新手也能看懂的完整指南

2026/9/29 5:31:58 拓冰建站 浏览量
tick-stock-panel 实时行情流架构:档位节流、订阅池与盘中突发故障隔离,新手也能看懂的完整指南 tick-stock-panel 实时行情流架构档位节流、订阅池与盘中突发故障隔离新手也能看懂的完整指南【免费下载链接】tick-stock-panelTSP自托管、零运维的 A 股「选股 监控 回测」量化工作台 | LLM能力驱使策略定制个股分析复盘 | 自由接入第三方数据源与个性化扩展数据 | 个人开源项目地址: https://gitcode.com/GitHub_Trending/ti/tick-stock-panel tick-stock-panel 是一款自托管、零运维的 A 股「选股 监控 回测」量化工作台。它的实时行情流由后台轮询线程驱动通过档位节流控制拉取频率、SSE 订阅池向多端广播事件、盘中突发故障隔离保证单次失败不拖垮整轮行情。本文带你从架构全景到关键源码5 分钟看懂这套实时数据管道如何做到又快又稳。一、架构全景一根线程撑起整条行情流水线tick-stock-panel 的实时行情核心是一个后台轮询线程单例QuoteService每 15 秒左右跑一轮数据流如下调用数据源 API 拉取全市场行情股票 ETF 核心指数原始价格写入kline_daily不复权日K增量计算全套技术指标写入 enriched 缓存与磁盘通过 SSEServer-Sent Events把更新广播到所有前端连接这套设计的关键点内存中的 enriched 缓存是盘中唯一数据源所有页面选股、自选、监控都读同一份缓存而不是各自请求数据源——这既省配额又保证各页面数据口径一致。核心文件quote_service.py二、档位节流不同套餐不同节奏自托管最怕把数据源配额打爆。tick-stock-panel 的做法是按档位设最小轮询间隔在 quote_service.py 中一目了然档位最小轮询间隔expert1 秒pro3 秒starter / free6 秒默认间隔 6 秒上限 60 秒用户设置值会被_clamp_interval()强制夹在档位下限与上限之间接入自定义数据源时不走档位限速中立能力原则只保留通用 1 秒下限档位本身由 policy.py 中的能力探测自动判定没有复权因子是免费档拥有批量分时/五档等能力签名才归入付费档单个能力探测失败不会把整体档位误降。TIER_MIN_INTERVAL { expert: 1.0, pro: 3.0, starter: 6.0, free: 6.0, }除轮询间隔外批量拉取还有一层进程级共享限速器rate_limits.py 按 rpm 分桶维护「下一个可用发包时刻」并刻意按套餐标称 rpm 的80% 安全系数SAFETY_RPM_FACTOR 0.8执行给偶发抖动留足余量。三、SSE 订阅池每个连接一个独立订阅者前端页面、告警推送、复盘进度都走同一条 SSE 通道。早期的常见坑是多个客户端共享一个事件队列——「取走」语义下先醒来的标签页消费掉告警其余设备永远收不到。tick-stock-panel 的解法在 api/intraday.py每个/stream连接注册一个独立的QuoteSubscriber独立事件 独立队列事件由QuoteService广播给所有人多标签页、多设备各自收到全量事件。QuoteSubscriber还有两个精巧的细节quote_service.py背压保护告警队列上限 1000 条复盘事件上限 200 条超限时丢弃最旧慢客户端不会拖垮服务端内存通道隔离行情刷新、策略结果、五档盘口、告警、复盘进度各自独立标志位五档修正只会触发连板梯队刷新不连带刷新自选列表。推送侧同样做了隔离飞书等 webhook 投递放在独立的 2 线程池中 fire-and-forgetquote_service.py即使推送目标宕机也绝不会阻塞行情热路径。四、盘中突发故障隔离一块失败不拖垮整轮全市场约 5500 只股票的分钟数据脉冲拉取是故障隔离设计的重点场景实现在 kline_sync.py 的fetch_intraday_full_market_burst切块并发按 batch_size200 把全市场切成约 28 块用 32 线程的线程池一次打出60 秒滑动窗口内至多一个脉冲天然不超安全 rpm单块独立容错每块把异常作为返回值上交而不是抛出——一个块失败其余成功块照常落盘线程池map迭代中抛异常会废弃全部已收数据这是旧实现的教训分级重试失败块 ≤ 4 个 → 逐个单独重试一次仍失败则跳过该块下一轮拉全天数据天然自愈失败块 4 个 → 判定为系统性故障/限流风暴直接跳过重试避免向已过载的服务端加压。这套契约有专门的单测保证test_intraday_burst_fault_isolation.py瞬时失败重试后 6 只全在、恒失败只跳过该块其余 4 只照常返回、系统性故障不重试。稳态场景还有一招省流量fetch_intraday_universe_increment用单请求返回全市场最新 3 根分钟K替代 28 块并发脉冲请求量 28→1、传输量约 40 倍下降缺口回补才走突发脉冲。五、配套细节标的池缓存与定版保护标的池Universe沪深300/中证500/上证50/全A/自选五种池拉取后以 parquet 原子写缓存避免半截文件导致每次读取报错pools.py午休/收盘定版确认只有快照时间戳越过 11:30 / 15:00 边界含 5 秒容差才允许落盘防止数据源收盘后仍返回竞价前旧价把陈旧收盘价固化进当日分区quote_service.py;管道互斥盘后管道运行期间行情轮询临时pause()线程存活、只跳过取数杜绝实时写入与管道重建互相覆盖同一批 parquet。六、上手体验在数据页开启实时行情后看板与监控中心即按档位节奏自动刷新SSE 断线会自动重连。想深入了解推荐阅读docs/features.md功能全景docs/secondary-development.md自定义数据源接入docs/deployment.md部署指南tick-stock-panel 用一根轮询线程、一层档位节流、一个订阅池和一套分块容错把「全市场实时行情」这件难事做得又快又稳。自托管部署、零运维把精力留给策略本身。【免费下载链接】tick-stock-panelTSP自托管、零运维的 A 股「选股 监控 回测」量化工作台 | LLM能力驱使策略定制个股分析复盘 | 自由接入第三方数据源与个性化扩展数据 | 个人开源项目地址: https://gitcode.com/GitHub_Trending/ti/tick-stock-panel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考