会话隔离是什么
多用户并发时会话之间必须严格隔离:上下文、缓存、临时文件都按会话键分区,会话标识要贯穿日志、缓存与存储三处。共享缓存只允许放与身份无关的内容,例如静态规则与公共知识;一旦把用户历史放进共享缓存,就等着串答事故上门。
基本信息
| 隔离键 | 租户 + 用户 + 会话三段拼接,缺一段都可能串 |
|---|---|
| 缓存 | 键含会话维度;共享缓存仅用于静态规则与公共知识 |
| 清理 | 会话结束即清除临时上下文与偏好缓存 |
| 并发写 | 同一会话串行化或用版本号做乐观锁 |
| 日志 | 会话标识贯穿全链路,便于定位串答发生在哪一环 |
典型使用场景
- 多租户 SaaS:同一进程服务多个客户,缓存的租户维度不能省
- 高并发对话:多个请求同时落在同一会话,需要串行化或冲突检测
- 网关层缓存:按需缓存检索结果时,键必须带会话标识
- 客服转接:会话移交后旧上下文清空,避免新坐席看到不该看的内容
- 压测验证:构造并发同会话请求,验证不出现上下文错乱
缓存键设计示例
缓存键设计示例
cache_key = hash(tenant_id | user_id | session_id | prompt_version)
共享缓存仅用于:
- 与身份无关的静态规则
- 公共知识与通用模板片段
用户历史与偏好:
- 仅会话级缓存,不跨用户复用
- 会话结束后立即失效共享与隔离的边界
| 内容 | 是否可共享 | 说明 |
|---|---|---|
| 公共知识片段 | 可共享 | 与身份无关,键不含会话 |
| 静态规则与模板 | 可共享 | 按版本缓存,变更即失效 |
| 用户历史与偏好 | 不可共享 | 必须带会话维度 |
| 检索结果 | 谨慎 | 与查询和权限都相关,需带租户 |
| 生成结果 | 不可共享 | 可能含个性化内容 |
串答事故往往来自一次“为了提命中率”的缓存合并。合并前先问:被合并的键里是否真的不含身份信息。