Event Persistence
RealtimeEventSaver
RealtimeEventSaver 负责将实时 SSE 事件批量持久化到数据库:
配置
| 配置项 | 值 | 说明 |
|---|---|---|
| 批量大小 | 3 个事件 | 缓冲区达到此数量时触发写入 |
| 批量间隔 | 100ms | 即使未满也定时刷新 |
| 重试次数 | 3 次 | 最大重试次数 |
| 重试策略 | 指数退避 | 1s → 2s → 4s |
| 降级方案 | LocalStorage | 所有重试失败后的备份存储 |
Message Batching
前端消息合并
前端合并快速连续的文本更新,避免过度渲染:| 策略 | 说明 |
|---|---|
| UI 批量刷新 | 约 60fps 频率批量更新,合并快速连续的 token |
| 虚拟滚动 | 只渲染可视区域的消息卡片 |
| 选择性持久化 | 只持久化 sessionId 和 messageIds,消息内容按需加载 |
Chat History 构建
前端从 Zustand Store 加载当前会话的消息历史,排除当前正在发送的消息,传递给后端。后端将其转换为 LangChain 消息类型,限制最多 30 条。Concurrency & Isolation
| 隔离维度 | 机制 | 说明 |
|---|---|---|
| Session | thread_id | 每个 Session 拥有独立的 Checkpointer 状态 |
| Context | session_id | Context Cache 按 session_id 隔离,resume 只恢复对应会话 |
| 工具执行 | LangGraph | 同一 Session 内工具串行执行,不会并发 |
| 工作空间 | user_id | 用户文件系统按 user_id 完全隔离 |
Session Recovery
系统支持会话中断后的恢复:保存时机
- 工具调用完成后
- 消息发送后
- HITL 中断时(通过 Checkpointer)