工作流时间回溯
Queuety 可以将工作流回退到之前的步骤,并从该步骤恢复执行。当某个步骤产生了错误输出、你希望使用不同配置重试,或需要从损坏的数据中恢复而不重启整个工作流时,这种方式很有用。
回退依赖 工作流事件日志。事件日志必须包含目标步骤的 state_after 数据。
回退工作流
PHP API
使用工作流 ID 和要回退到的步骤索引调用 Queuety::rewind_workflow():
PHP
use Queuety\Queuety;
// Rewind workflow 42 to step 1.
// The state is restored to the snapshot taken after step 1 completed,
// and step 2 is enqueued for re-execution.
Queuety::rewind_workflow( $workflow_id, to_step: 1 );
to_step 参数是要恢复其已完成状态的步骤从零开始的索引。执行会从下一步骤(to_step + 1)恢复。
CLI
命令行
wp queuety workflow rewind <id> <step>
| 选项 | 说明 |
|---|---|
<id> |
工作流 ID(必填) |
<step> |
要回退到的步骤索引,从 0 开始(必填) |
命令行
wp queuety workflow rewind 42 1
工作原理
将工作流回退到步骤 N 时:
- 查询事件日志,获取步骤 N 完成后记录的
state_after值 - 如果不存在快照,则抛出
RuntimeException - 锁定工作流行
- 将工作流状态替换为快照,同时保留当前工作流行中的所有保留键(
_steps、_queue、_priority等) - 将
current_step设为 N + 1,并将status设为running - 清除所有
error_message和failed_at字段 - 将索引为 N + 1 的步骤加入队列以供处理
- 记录一条
workflow_rewound日志事件
随后,工作进程会取出已加入队列的步骤,工作流从该处起照常继续运行。
要求
回退需要事件日志中有 state_after 数据。每次 step_completed 事件都会自动记录该数据。如果事件日志已被清理(通过 WorkflowEventLog::prune()),且目标步骤的状态不再存在,回退就会失败。
请确保事件日志的保留期限涵盖你可能需要回退到的时间段。
使用场景
修复有缺陷的步骤处理程序
如果某个步骤处理程序存在缺陷并产生了错误输出,你可以部署修复,然后回退:
PHP
// Step 2 (CallLLMHandler) produced garbled output due to a prompt bug.
// After fixing CallLLMHandler, rewind to step 1 so step 2 runs again
// with the corrected handler.
Queuety::rewind_workflow( $workflow_id, to_step: 1 );
使用不同配置重试
当步骤因外部因素(API 速率限制、凭据错误)而失败时,修正配置并回退以重新运行:
PHP
// Step 3 failed because the API key was expired.
// After updating the key, rewind to step 2 so step 3 retries.
Queuety::rewind_workflow( $workflow_id, to_step: 2 );
从错误数据中恢复
如果较早的步骤向状态中写入了错误数据,请回退到已知正常的快照:
PHP
// Step 0 fetched correct data, but step 1 corrupted it.
// Rewind to step 0 to restore the good state and re-run step 1.
Queuety::rewind_workflow( $workflow_id, to_step: 0 );
与重试的比较
| 方面 | retry_workflow() |
rewind_workflow() |
|---|---|---|
| 恢复位置 | 失败的步骤 | 任意先前步骤 |
| 状态 | 当前工作流状态 | 从事件日志 state_after 恢复 |
| 要求 | 工作流处于 failed 状态 |
目标步骤存在事件日志快照 |
| 操作后状态 | running |
running |
| 日志事件 | 无 | workflow_rewound |