SSE通信机制

📎 引用文件

本文引用的文件 - frontend/src/hooks/useSSE.ts - frontend/src/lib/api.ts - frontend/src/pages/Agent.tsx - agent/src/session/events.py - agent/src/api/swarm_routes.py - agent/src/channels/signal.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 Vibe-Trading 研究页面的 Server-Sent Events(SSE)通信机制,覆盖连接建立、事件监听、自动重连、消息流处理、错误恢复、连接状态管理、事件类型与数据格式规范、性能优化技巧、连接池与内存泄漏防护、调试工具使用以及常见问题排查。文档以代码为依据,提供可追溯的源码路径与图示,帮助读者从前端到后端完整理解 SSE 的工作方式。

项目结构

研究页面通过前端 Hook 建立并维护 SSE 连接,订阅会话事件流;后端基于事件总线将业务事件序列化为 SSE 帧并通过 HTTP 流式响应推送给客户端。关键路径: - 前端:useSSE Hook 负责 EventSource 生命周期、自动重连、去重、Last-Event-ID 续传、认证票据注入。 - 前端 API:提供会话 SSE URL 构造方法,支持 replay 参数用于活跃运行恢复。 - 前端页面:注册具体事件处理器,驱动 UI 状态更新。 - 后端事件总线:封装 SSEEvent 序列化、按会话缓冲、订阅者队列、心跳与回放能力。 - 后端路由:示例展示如何生成 SSE 文本帧并持续推送,直至任务结束或断开。

graph TB FE["前端: useSSE Hook"] --> |EventSource 连接| BE["后端: /sessions/{sid}/events"] FE --> |事件处理器| UI["研究页面 UI"] BE --> EB["事件总线 EventBus"] EB --> |订阅/回放| BE BE --> |text/event-stream| FE

图表来源 - frontend/src/hooks/useSSE.ts:27-194 - frontend/src/lib/api.ts:181-188 - agent/src/session/events.py:20-54 - agent/src/api/swarm_routes.py:187-211

章节来源 - frontend/src/hooks/useSSE.ts:27-194 - frontend/src/lib/api.ts:181-188 - agent/src/session/events.py:20-54 - agent/src/api/swarm_routes.py:187-211

核心组件

章节来源 - frontend/src/hooks/useSSE.ts:27-194 - frontend/src/lib/api.ts:181-188 - frontend/src/pages/Agent.tsx:679-839 - agent/src/session/events.py:20-54 - agent/src/session/events.py:57-240 - agent/src/api/swarm_routes.py:187-211

架构总览

下图展示了从前端连接到后端事件总线,再到事件回放的端到端流程。

sequenceDiagram participant FE as "前端 : useSSE" participant API as "前端 : api.sseUrl" participant BE as "后端 : /sessions/{sid}/events" participant EB as "后端 : EventBus" participant UI as "前端 : 研究页面" FE->>API : 构建 SSE URL (含 replay?) FE->>BE : EventSource 连接 (可能带 Last-Event-ID) BE->>EB : subscribe(session_id, last_event_id) EB-->>BE : 回放缓冲事件(可选) BE-->>FE : text/event-stream 帧(id/event/data) FE->>UI : 分发事件处理器(text_delta/tool_call/...) Note over FE,BE : 断线后 useSSE 自动重连并携带 lastEventId

图表来源 - frontend/src/hooks/useSSE.ts:63-156 - frontend/src/lib/api.ts:181-188 - agent/src/session/events.py:127-240 - agent/src/api/swarm_routes.py:187-211

详细组件分析

前端:useSSE Hook

flowchart TD Start(["connect(url, handlers)"]) --> BuildURL["buildUrl(附加 Last-Event-ID)"] BuildURL --> Auth{"是否需要票据?"} Auth -- 否 --> Attach["attach(EventSource)"] Auth -- 是 --> Mint["withAuthTicket()"] --> Attach Attach --> OnOpen{"onopen"} OnOpen --> SetConnected["setStatus('connected')"] Attach --> OnError{"onerror"} OnError --> Close["source.close()"] Close --> Schedule["scheduleReconnect(指数退避)"] Schedule --> Reconnect["doConnect(generation)"]

图表来源 - frontend/src/hooks/useSSE.ts:63-174

章节来源 - frontend/src/hooks/useSSE.ts:27-194

前端:API 层与会话 URL

章节来源 - frontend/src/lib/api.ts:181-188

前端:研究页面事件处理

章节来源 - frontend/src/pages/Agent.tsx:679-839

后端:事件总线与 SSE 帧

classDiagram class SSEEvent { +string event_id +string event_type +dict data +string session_id +float timestamp +to_sse() string } class EventBus { +int max_buffer_size +publish(event) void +subscribe(session_id, last_event_id, replay_all) AsyncIterator +replay(session_id, last_event_id, replay_all) List +clear(session_id) void } EventBus --> SSEEvent : "发布/回放"

图表来源 - agent/src/session/events.py:20-54 - agent/src/session/events.py:57-240

章节来源 - agent/src/session/events.py:20-54 - agent/src/session/events.py:57-240

后端:SSE 路由示例

章节来源 - agent/src/api/swarm_routes.py:187-211

其他 SSE 消费者示例(Signal 通道)

章节来源 - agent/src/channels/signal.py:486-673

依赖关系分析

graph LR AgentTSX["Agent.tsx"] --> useSSE["useSSE.ts"] useSSE --> apiTS["api.ts"] apiTS --> routes["后端路由"] routes --> eventsPy["events.py"]

图表来源 - frontend/src/pages/Agent.tsx:679-839 - frontend/src/hooks/useSSE.ts:27-194 - frontend/src/lib/api.ts:181-188 - agent/src/api/swarm_routes.py:187-211 - agent/src/session/events.py:57-240

章节来源 - frontend/src/pages/Agent.tsx:679-839 - frontend/src/hooks/useSSE.ts:27-194 - frontend/src/lib/api.ts:181-188 - agent/src/api/swarm_routes.py:187-211 - agent/src/session/events.py:57-240

性能考量

[本节为通用指导,不直接分析具体文件]

故障排查指南

章节来源 - frontend/src/lib/api.ts:181-188 - frontend/src/hooks/useSSE.ts:44-56 - frontend/src/hooks/useSSE.ts:136-174 - frontend/src/pages/Agent.tsx:757-784 - agent/src/session/events.py:114-126 - agent/src/session/events.py:151-183

结论

Vibe-Trading 研究页面的 SSE 通信机制在前端通过 useSSE Hook 实现了健壮的连接管理、自动重连与事件去重;在后端通过事件总线统一封装事件序列化、缓冲与回放能力,配合路由层的流式输出,形成高可靠、低延迟的实时通信链路。结合心跳、缓冲上限与线程安全设计,系统具备良好的可扩展性与稳定性。建议在生产环境中监控重连频率、缓冲占用与事件吞吐,按需调优参数以获得最佳体验。

[本节为总结性内容,不直接分析具体文件]

附录

SSE 事件类型定义(前端已知类型)

章节来源 - frontend/src/hooks/useSSE.ts:85-96

数据格式规范

章节来源 - agent/src/session/events.py:38-54 - agent/src/api/swarm_routes.py:187-211

连接池管理与内存泄漏防护

章节来源 - frontend/src/hooks/useSSE.ts:176-206 - frontend/src/hooks/useSSE.ts:44-56 - agent/src/session/events.py:226-240 - agent/src/session/events.py:99-112

调试工具使用

[本节为通用指导,不直接分析具体文件]