Skip to content

Chat ownership、心跳与恢复方案

Chat ownership、心跳与恢复图

Draw.io 源文件 | 架构目录

1. 方案摘要

本方案用 owner replica id、token 和 epoch 构成 Chat 写入保护,用副本 heartbeat 与 monitor 识别失联,再通过 fencing、恢复记录和单条 CAS 完成接管。目标是让旧 Runtime 即使延迟返回,也不能覆盖新 owner 的会话状态。

2. 设计目标与非目标

设计目标

  • 防止同一 Chat 被多个 Runtime 同时写入。
  • 区分正常关停、异常失联和用户主动拒绝。
  • 让恢复过程可重试、可观测,并保持消息语义连续。

非目标

  • 不保证进程级内存任务在硬件故障后原地继续。
  • 不把 sticky routing 当成一致性保证。
  • 不新增用户消息来掩盖一次执行中断。

3. 架构范围与视图

Runtime 如何取得 Chat 所有权、保护写入,并在正常重启或副本失联后安全收口和恢复?

本图描述当前 ownership fence、replica heartbeat、失联扫描和恢复 CAS,不把历史 sticky-only 方案作为现状。

图中绿色实线表示当前能力,紫色虚线表示规划或待完善能力。图片用于建立空间关系,本文正文定义方案语义、边界和落地规则。

4. 组件与责任边界

组件责任
Ownership claim任务启动前 CAS 写入 replica id、token 和递增 epoch。
Ownership guardsession id、终态、归档等写入必须携带本轮 guard。
HeartbeatRuntime 或组合角色登记副本并更新心跳、任务数和状态。
Replica monitorGateway 或组合角色通过独立 leader domain 扫描 suspect 与 expired 副本。
Self-fenceRuntime 发现自身记录失效时进入维护、取消任务并退出。
正常重启恢复暂停任务、flush、归档、写恢复记录,静默窗口后再派发。
恢复 claimRuntime 用 recovery id、token、checkpoint epoch 和 Chat 条件执行单条 CAS。
恢复语义仅关停直接打断的最后一个未完成工具调用可视为技术性中断;恢复 Agent 续写原 assistant 消息。

组件之间只通过明确的输入、输出和生命周期契约协作。上层可以编排下层能力,但不能绕过下层的权限、租户和状态边界直接读写内部对象。

5. 核心设计决策

  • Claim 使用 CAS 写入 replica id、token 和递增 epoch。
  • 所有关键写入携带完整 ownership guard,旧 epoch/token 自动失效。
  • 失联先 suspect,再 CAS expired 和收口 running Chat,最后经过静默窗口恢复。

这些决策共同保证:入口可以替换、执行可以迁移、状态可以恢复,而不会改变用户可见的任务和会话语义。

6. 关键流程与时序

主流程

  1. Runtime claim Chat owner
  2. 运行中持续 guarded writes 与 heartbeat
  3. 正常关停则暂停、归档并创建恢复记录
  4. 异常失联则 monitor 先 suspect 后 CAS expired
  5. 匹配旧 guard 的 running Chat 才能失败收口
  6. Gateway 领取恢复记录并按稳定路由键派发
  7. 新 Runtime 单条 CAS 取得新 owner 并恢复

流程解释

流程中的每一步都应产生可追踪的上下文:租户、Agent、Chat、Task、运行副本和结果引用。过程事件用于向用户反馈进度,终态写入和结果归档必须在事实源更新后再对外确认。

7. 数据、一致性与状态管理

  • 共享数据库是 Chat、Replica 和 Recovery 的事实源。
  • 恢复记录使用租约、退避和稳定 route key,避免多个副本重复接管。
  • 恢复 Agent 续写原 assistant 消息,不新增用户消息。

当前专题的关键约束

  • expired 副本不能复活。
  • 旧 Runtime 回调只能发布事件,不能覆盖新 owner 状态。
  • 更早的用户拒绝、权限或运行策略拒绝仍然有效。
  • 恢复过程续写原 assistant 消息,不新增用户消息。
  • 公共副本库与租户 Chat 库之间不依赖跨库事务。

8. 异常、恢复与安全边界

  • Runtime 发现自身记录失效时 self-fence,进入维护、取消任务并退出。
  • expired 副本不能复活,旧回调只能发布事件不能覆盖状态。
  • 关停直接打断的最后一个未完成工具调用可视为技术性中断;更早的用户拒绝、权限或运行策略拒绝仍有效。

异常处理遵循“先阻止错误扩散,再保留可恢复状态,最后由明确的补偿动作完成收口”。任何重试都必须具备幂等条件,任何恢复都必须重新校验租户、权限、版本和 ownership。

9. 部署与扩展边界

  • Gateway 或组合角色承担 monitor leader,Runtime 负责 heartbeat 和执行。
  • 恢复接口必须具备内部鉴权、route key 和单条 CAS 条件。

部署形态可以变化,但不能把本地内存、临时文件或单副本事件队列当作跨副本事实源。需要横向扩展的能力应先明确共享状态、路由键、健康状态和故障补偿方式。

10. 当前能力与演进计划

当前已落地

  • Chat ownership fence
  • Runtime heartbeat / monitor / self-fence
  • 正常重启的恢复记录、租约与退避

规划或待完善

  • 跨副本实时事件适配与完整故障演练

演进方向

  • 补齐跨副本实时事件适配、故障演练和恢复指标。
  • 增加恢复积压、接管耗时、CAS 冲突和 self-fence 监控。

11. 方案验收要点

  • 旧 owner 延迟写入不会改变新 owner 状态。
  • 正常关停可以生成恢复记录并在静默窗口后恢复。
  • 异常恢复不新增用户消息,原 assistant 消息可以继续生成。

验收时应同时检查正常链路、重复操作、空态或拒绝态、依赖不可用和副本切换,不能只验证图中最短路径。