Prefill + Migration 联合时序分析(打印版)

用于回顾 prefill_opmigration 的协同流程, 重点关注 decode 流中断后的迁移重建

1) 联合时序图

sequenceDiagram autonumber participant U as 上游调用方(HTTP/SSE) participant M as Migration(RetryManager) participant P as PrefillRouter(prefill_op) participant Wp as Prefill Worker participant Wd1 as Decode Worker #1 participant Wd2 as Decode Worker #2 U->>M: generate(request) M->>M: 创建 RetryManager(重试额度/状态追踪) M->>P: next.generate(request) (首次建流) Note over P: 先做 prefill,再进入 decode alt 异步 bootstrap prefill P->>Wp: 发起 prefill(后台) P->>P: 先构造 decode_req(带 bootstrap_info 占位) else 同步 prefill P->>Wp: 执行 prefill Wp-->>P: 返回 prefill_result(disaggregated_params) P->>P: 注入 decode_req + decode_router_override end P->>Wd1: 启动 decode 流 Wd1-->>M: chunk1/chunk2/... M-->>U: 透传输出(并持续 track 已生成状态) Note over Wd1,M: 运行中发生断连/EngineShutdown(可迁移错误) Wd1--x M: error (migratable) M->>M: 减少 retries_left + 用已跟踪状态重建请求 M->>P: next.generate(rebuilt_request) (重建新流) Note over P: 重建时通常跳过重复 prefill影响,继续 decode 路由 P->>Wd2: 启动新的 decode 流(带 override,避免错误复用统计) Wd2-->>M: chunkK/chunkK+1/... M-->>U: 继续输出(对上游看起来是同一条 ResponseStream) alt 正常结束 Wd2-->>M: None(end of stream) M-->>U: 流结束 else 再次失败且额度耗尽/不可迁移 Wd2--x M: error M-->>U: 返回最终错误并结束 end

2) RetryManager::next() 四态图

stateDiagram-v2 [*] --> S1: 首次调用 next() S1: S1 建流/拿流 S2: S2 正常读流 S3: S3 发生可迁移错误后重建流 S4: S4 终止(成功结束或重试耗尽) S1 --> S2: 下游 stream 创建成功 S1 --> S3: 建流失败 且 error 可迁移 且 retries_left > 0 S1 --> S4: 建流失败但不可迁移/无重试额度 S2 --> S2: 读取到正常 chunk 并向上游 yield S2 --> S4: 读取到 None(自然结束) S2 --> S3: 读取到可迁移错误 且 retries_left > 0 S2 --> S4: 不可迁移错误 或 重试耗尽 S3 --> S2: 用已跟踪状态重建请求并建流成功 S3 --> S3: 再次失败但仍可迁移且还有额度 S3 --> S4: 重建失败且不可迁移/无额度

3) 结论速记

4) Mermaid 不可用时备用文本

U -> M: generate(request) M -> P: next.generate(request) 首次建流 P -> Wp: prefill(异步 bootstrap 或 同步 prefill) P -> Wd1: decode 流 Wd1 -> M: chunk... M -> U: 透传 + track 状态 Wd1 -x M: migratable error M -> M: 重试计数减少 + 重建请求 M -> P: next.generate(rebuilt_request) P -> Wd2: 新 decode 流 Wd2 -> M -> U: 继续输出 最终: 正常结束 or 不可迁移/重试耗尽后结束