Skip to content

perf(session): 去重 Redis 中重复存储的 response body #1415

Description

@AptS-1547

背景

#1414#1408 增加了 SESSION_RESPONSE_BODY_MAX_BYTES,限制单份 session response body
写入 Redis 的大小。当前响应正文仍可能同时写入三类 key:

  • legacy/request response:session:{sessionId}:req:{sequence}:response
  • response before snapshot body
  • response after snapshot body

当 before、after 与最终 response 内容相同或高度重合时,Redis 会保存最多三份完整正文。#1408
的隔离复现中,64 个约 7.5 MiB SSE 响应因此形成约 1.4 GiB 原始正文值,并在 RDB 保存窗口把
Redis 峰值推到约 1.5 GiB。

#1414 先通过单份大小上限控制风险,默认值按当前运维取舍设为 5 MiB;三份复制需要独立设计和
负载验证,避免在 OOM 修复中混入未经验证的数据布局迁移。

目标

  • 同一 request sequence 的 response 正文只保留一份物理 Redis value,或使用具有相同内存上界的
    内容寻址/引用机制。
  • before、after 和 legacy/request response 继续保持现有读取语义;内容确实不同时仍能分别查看。
  • STORE_SESSION_MESSAGES=false 的脱敏结果必须在去重/哈希前生效,原始敏感正文不得通过共享值泄漏。
  • 单请求正文总 Redis 预算由一个明确上限控制,不再随视图数量线性放大。

兼容边界

  • 兼容 TTL 窗口内由旧版本写入的现有 key;滚动部署期间新旧读取路径可互操作。
  • headers/meta 继续独立保存,正文超限或缺失时仍可查看请求阶段、状态码和 URL 等诊断信息。
  • STORE_SESSION_RESPONSE_BODY=false 继续完全跳过正文写入。
  • 不改变代理响应、token/费用统计、SSE 协议检测或 Replay durable payload 语义。

验收标准

  • 为 legacy response、before、after 三者完全相同、两者相同、三者不同分别增加单元测试。
  • 增加覆盖脱敏后相同、脱敏后不同、UTF-8 字节上限和旧 key 读取兼容的边界测试。
  • 对更新/重试覆盖旧正文的路径验证无悬空引用、无错误复用和 TTL 一致性。
  • 使用 物理真机卡死过2次 gpt5.6分析的结果 #1408 仓库负载夹具运行 64 个 5 MiB session response,请求完成后 Redis 正文原始值预算不超过单份上限乘请求数。
  • 覆盖 Redis RDB 保存窗口,记录 used_memory_peak、容器峰值、OOM/退出状态和清理后的 key 数量。
  • 更新 session response body 配置说明和 物理真机卡死过2次 gpt5.6分析的结果 #1408 调查文档。

关联

Metadata

Metadata

Projects

Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions