ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PanWatch SSE 实时事件流深度解析:价格异动推送的底层链路是怎么跑的

PanWatch SSE 实时事件流深度解析:价格异动推送的底层链路是怎么跑的 PanWatch SSE 实时事件流深度解析价格异动推送的底层链路是怎么跑的【免费下载链接】PanWatchPanWatch — AI stock monitoring for A-shares, HK US markets, powered by TradingAgents. Portfolio insights, real-time alerts automated reports.盯盘侠覆盖 A股/港股/美股的 AI 盯盘、持仓分析、实时提醒与自动报告。项目地址: https://gitcode.com/GitHub_Trending/pa/PanWatchPanWatch盯盘侠是一款覆盖 A股/港股/美股的 AI 盯盘工具其价格异动提醒、Agent 运行进度、AI 助手对话都依赖同一条SSEServer-Sent Events实时事件流链路。本文带你用最短的路径看穿这条链路事件如何产生、如何编码、如何在断线后无缝续推以及前端如何消费。一张图看懂链路全貌先给结论整条链路由 4 个环节组成生产者后台任务价格提醒引擎、Agent 运行器产生事件与 HTTP 连接完全解耦SSE 基础设施统一的事件缓冲、编码、续推能力src/platform/events/sse.pySSE 端点以text/event-stream响应逐块推送到浏览器前端消费者自动重连 Last-Event-ID续推frontend/packages/api/src/sse.ts。下面逐层拆开。第一层价格异动是怎么被看见的价格提醒的起点是一个定时调度器默认每 60 秒最短 15 秒触发一次全量扫描调度器price_alert_scheduler.py —— 启动时注册 interval 任务反复调用ENGINE.scan_once()引擎price_alert_engine.py —— 一轮扫描做四件事拉全市场实时报价带 5s 缓存 多数据源主备切换 ↓ 逐条规则评估价格 / 涨跌幅 / 成交额 / 成交量 / 量比 ↓ 闸门过滤交易时段、每日上限、冷却期、once 模式 ↓ 命中落库 通过通知渠道推送邮件 / 机器人等规则支持and / or组合命中后会写入PriceAlertHit表并按分钟桶去重保证同一分钟内不会重复轰炸。这一层的产物是提醒命中这一事实接下来的问题就是如何让前端页面立刻知道第二层SSE 基础设施 —— 生产与消费彻底解耦这是整条链路里最值得学习的设计全部浓缩在 src/platform/events/sse.py 一个文件里只有三个核心概念概念职责关键参数format_sse_event把事件编码为 SSE wire 格式带自增序号idid / event / data三行SSEStream一条可重放的事件流生产者publish消费者subscribe单流上限 10000 条事件SSEHub按stream_id管理多条流带 TTL 自动清理流结束后保留 600 秒三个设计点值得圈出来① 生成过程与连接解耦。生产者后台任务往SSEStream里 publish 事件完全不管有没有人连着。断线不会中断生成任务照样跑完。② 任意序号续推。消费者可以从after_seq开始订阅先重放缓冲里已有的事件再阻塞等新事件。这就是断线重连能补齐中间丢失内容的根基——靠的就是每条事件自增的id和浏览器标准的Last-Event-ID头。③ 流结束后仍保留 10 分钟。STREAM_TTL_SEC 600专门留给迟到的重连——比如你刚关掉页面又打开还能读到完整结果而不是拿到一个空流。第三层SSE 端点与中间件的逐块直通服务端端点统一返回StreamingResponse媒体类型text/event-stream并带上两个关键响应头Cache-Control: no-cache禁止缓存X-Accel-Buffering: no告诉 Nginx 这类反向代理不要缓冲否则流式会变成一次性返回。举个典型端点的例子——Agent 运行进度流agents.py服务端每秒取一次进度快照只有快照发生变化才推progress事件连续 15 秒无变化就发一条 SSE 注释行: keepalive当心跳防止代理因空闲断开连接运行到达终态success/failed后推一条done事件并关流。这里还有一个容易踩坑的细节PanWatch 的全局 API 中间件会把所有/api/响应包装成统一的{code, success, data}JSON。对 SSE 来说缓冲即灾难——所以 response.py 专门做了一个判断响应头是text/event-stream时走逐块直通模式一个字节都不攒保证前端收到的是真正的增量事件。第四层前端 SSE 客户端 —— 自动重连与降级前端的 SSE 基建在 frontend/packages/api/src/sse.ts只有两个函数readSSE基于fetch ReadableStream建立单次连接因为原生EventSource带不了Authorization头解析id: / event: / data:三行返回本次收到的最后序号subscribeSSE包装自动重连。断线后按1s → 2s → 4s → 8s 的指数退避重连并在请求头带上Last-Event-ID服务端从该序号之后续推用户感知不到丢事件重试次数用尽则触发onFailed调用方降级为轮询保证功能不中断。消费场景覆盖了所有实时需求AI 助手对话/api/assistant/tasks/{task_id}/events端点assistant/api.py按序号回放任务事件聊天面板逐 token 打字机效果就是它驱动的Agent 进度TradingAgents 等深度分析运行时进度条、日志实时滚动运行日志管理端日志流同样是最新 id 起订阅 断线续推的模式。5 个关键数字记住整条链路数字含义出处60s价格提醒默认扫描间隔最短 15sprice_alert_scheduler.py15sSSE 心跳间隔防代理断空闲连接sse.py10000单条流事件数量上限内存保护同上600s流结束后缓冲保留时长供迟到重连同上1/2/4/8s前端断线重连指数退避节奏sse.ts常见问题 FAQ为什么用 SSE 而不是 WebSocket行情提醒、运行进度这类场景是单向推送SSE 天然够用基于 HTTP、自带断线重连语义Last-Event-ID、可过大多数代理实现成本远低于 WebSocket 的双向连接管理。断网 10 秒会丢事件吗不会。服务端事件先进缓冲再推送重连时带Last-Event-ID从头补齐流结束后还有 10 分钟保留窗口。SSE 挂了页面会卡死吗不会。subscribeSSE重试用尽后回调onFailed页面降级为普通轮询如GET .../progress端点仍保留只是实时性变差。小结PanWatch 的实时链路可以概括为一句话事件先落地缓冲、连接只管消费、序号保证续推、心跳保住连接、前端负责重连与降级。这套模式不依赖任何重型中间件仅靠sse.pysse.ts两个小文件就撑起了价格异动提醒、Agent 进度、AI 对话三大实时场景非常适合作为自己项目引入 SSE 的参考实现。想动手体验的话可以直接浏览这两个核心文件服务端基建src/platform/events/sse.py前端基建frontend/packages/api/src/sse.ts价格提醒引擎src/modules/market/price_alert_engine.py【免费下载链接】PanWatchPanWatch — AI stock monitoring for A-shares, HK US markets, powered by TradingAgents. Portfolio insights, real-time alerts automated reports.盯盘侠覆盖 A股/港股/美股的 AI 盯盘、持仓分析、实时提醒与自动报告。项目地址: https://gitcode.com/GitHub_Trending/pa/PanWatch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表