消息缓存策略

📎 引用文件

本文引用的文件 - agent/src/session/service.py - agent/src/session/store.py - agent/src/session/models.py - agent/src/memory/persistent.py - agent/src/memory/lifecycle.py - agent/src/memory/search_index.py

目录

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

简介

本文件面向 Vibe-Trading 研究页面的“消息缓存系统”,围绕会话级消息的持久化、增量更新、去重、内存与容量管理、LRU/重要性淘汰、跨标签页同步、监控调试与故障恢复进行系统化说明。后端采用“追加式 JSONL 日志 + 文件系统”的消息存储,配合“持久化记忆(PersistentMemory)+ 生命周期(Lifecycle)”实现跨会话的记忆缓存;搜索索引提供快速检索与自动重建;事件总线通过 SSE 将状态变更推送到前端,实现多标签页一致视图。

项目结构

graph TB subgraph "会话层" Svc["SessionService<br/>会话编排"] Store["SessionStore<br/>JSONL 消息日志"] Models["Models<br/>Session/Message/Attempt"] end subgraph "记忆层" PM["PersistentMemory<br/>文件型记忆"] LC["MemoryLifecycle<br/>质量/衰减/GC"] FTS["SearchIndex<br/>全文索引"] end subgraph "传输层" Bus["EventBus<br/>SSE 事件"] end Svc --> Store Svc --> Bus Svc --> PM PM --> FTS LC --> PM Store --> Models

图表来源 - agent/src/session/service.py:158-221 - agent/src/session/store.py:151-193 - agent/src/memory/persistent.py:196-206 - agent/src/memory/lifecycle.py:183-273

章节来源 - agent/src/session/service.py:158-221 - agent/src/session/store.py:151-193 - agent/src/session/models.py:140-342 - agent/src/memory/persistent.py:196-206 - agent/src/memory/lifecycle.py:183-273

核心组件

章节来源 - agent/src/session/service.py:158-221 - agent/src/session/service.py:515-565 - agent/src/session/store.py:151-193 - agent/src/memory/persistent.py:440-461 - agent/src/memory/persistent.py:358-438 - agent/src/memory/lifecycle.py:112-159 - agent/src/memory/lifecycle.py:183-273

架构总览

消息流从用户输入开始,经会话服务落盘为 JSONL,同时更新搜索索引;AgentLoop 执行后生成助手回复,再次追加并广播完成事件;前端通过 SSE 订阅事件,渲染增量消息。记忆模块在写入新条目时触发去重、索引更新与语义链接发现;GC 周期性地依据重要性对旧条目进行归档/删除与压缩。

sequenceDiagram participant UI as "前端界面" participant API as "会话服务" participant STORE as "会话存储" participant IDX as "搜索索引" participant AG as "AgentLoop" participant MEM as "持久化记忆" participant BUS as "事件总线(SSE)" UI->>API : 发送用户消息 API->>STORE : 追加消息(JSONL, fsync) API->>IDX : 索引消息(会话/角色/内容) API->>BUS : 广播 message.received API->>AG : 异步执行尝试 AG-->>API : 执行结果(状态/指标/工具轨迹) API->>STORE : 追加助手回复 API->>IDX : 索引助手回复 API->>BUS : 广播 attempt.completed/cancelled/failed UI-->>UI : 增量渲染消息

图表来源 - agent/src/session/service.py:158-221 - agent/src/session/service.py:248-344 - agent/src/session/store.py:151-193

章节来源 - agent/src/session/service.py:158-221 - agent/src/session/service.py:248-344 - agent/src/session/store.py:151-193

详细组件分析

会话消息缓存与增量更新

flowchart TD Start(["写入消息"]) --> Append["追加到 JSONL<br/>flush + fsync"] Append --> IndexMsg["索引消息(会话/角色/内容)"] IndexMsg --> EmitEvt["广播 message.received"] EmitEvt --> End(["完成"])

图表来源 - agent/src/session/store.py:151-163 - agent/src/session/store.py:164-193 - agent/src/session/service.py:158-221

章节来源 - agent/src/session/store.py:151-193 - agent/src/session/service.py:158-221 - agent/src/session/service.py:515-565

会话并发控制与失效策略

flowchart TD Enter(["收到 send_message"]) --> Reserve{"是否已占用?"} Reserve -- 是 --> Conflict["抛出 SessionBusyError"] Reserve -- 否 --> AppendMsg["追加用户消息"] AppendMsg --> CreateAttempt["创建 Attempt"] CreateAttempt --> RunTask["异步执行 _run_attempt"] RunTask --> Finally["finally 释放占用/清理任务"] Finally --> Done(["结束"])

图表来源 - agent/src/session/service.py:93-117 - agent/src/session/service.py:158-221 - agent/src/session/service.py:227-246 - agent/src/session/service.py:248-344

章节来源 - agent/src/session/service.py:93-117 - agent/src/session/service.py:158-221 - agent/src/session/service.py:227-246 - agent/src/session/service.py:248-344

持久化记忆的内存限制与 LRU/重要性淘汰

classDiagram class PersistentMemory { +list_entries() +find_relevant(query) +is_duplicate(name, description, content) +add(name, content, type, description) -_recent_hashes -_load_snapshot() } class MemoryLifecycle { +reinforce(name, event, source) +track_access(entry) +run_gc(dry_run) -_execute_gc_action(entry, action) } PersistentMemory <.. MemoryLifecycle : "被包装/调用"

图表来源 - agent/src/memory/persistent.py:196-206 - agent/src/memory/persistent.py:440-461 - agent/src/memory/persistent.py:462-578 - agent/src/memory/lifecycle.py:183-273

章节来源 - agent/src/memory/persistent.py:21-33 - agent/src/memory/persistent.py:440-461 - agent/src/memory/persistent.py:462-578 - agent/src/memory/lifecycle.py:183-273

消息去重算法

flowchart TD A["准备写入记忆条目"] --> B["计算哈希(content_hash)"] B --> C{"窗口内是否存在相同哈希?"} C -- 是 --> D["视为重复,跳过写入"] C -- 否 --> E["写入条目并更新时间戳"] E --> F["清理过期哈希"]

图表来源 - agent/src/memory/persistent.py:35-38 - agent/src/memory/persistent.py:440-461

章节来源 - agent/src/memory/persistent.py:35-38 - agent/src/memory/persistent.py:440-461

增量更新机制

章节来源 - agent/src/session/service.py:158-221 - agent/src/session/service.py:515-565 - agent/src/memory/persistent.py:565-578

缓存失效策略

章节来源 - agent/src/session/service.py:153-156 - agent/src/memory/lifecycle.py:275-298 - agent/src/memory/persistent.py:358-393

跨标签页同步

章节来源 - agent/src/session/service.py:158-221 - agent/src/session/service.py:248-344

缓存监控、调试工具与故障恢复

章节来源 - agent/src/memory/lifecycle.py:300-317 - agent/src/memory/lifecycle.py:323-378 - agent/src/session/store.py:174-193 - agent/src/memory/persistent.py:41-73

依赖关系分析

graph LR Service["SessionService"] --> Store["SessionStore"] Service --> Bus["EventBus"] Service --> Index["SearchIndex"] Service --> Mem["PersistentMemory"] Mem --> Life["MemoryLifecycle"] Mem --> Link["SemanticLinks"]

图表来源 - agent/src/session/service.py:158-221 - agent/src/memory/persistent.py:358-438 - agent/src/memory/lifecycle.py:183-273

章节来源 - agent/src/session/service.py:158-221 - agent/src/memory/persistent.py:358-438 - agent/src/memory/lifecycle.py:183-273

性能考虑

章节来源 - agent/src/session/store.py:164-193 - agent/src/memory/persistent.py:21-33 - agent/src/memory/persistent.py:358-393 - agent/src/memory/persistent.py:440-461 - agent/src/session/service.py:515-565 - agent/src/memory/lifecycle.py:183-273

故障排查指南

章节来源 - agent/src/session/service.py:158-221 - agent/src/session/store.py:174-193 - agent/src/memory/lifecycle.py:300-317 - agent/src/memory/persistent.py:41-73

结论

该消息缓存系统以“追加式 JSONL 日志 + 文件系统”为核心,结合“持久化记忆 + 生命周期管理”实现跨会话的记忆缓存与容量治理;通过 FTS5 索引与语义链接提升检索效率;借助 SSE 事件总线实现多标签页一致视图。系统在并发控制、去重、增量更新、GC 与压缩方面提供了完善的机制,并通过日志与原子写入保障可观测性与可靠性。

附录