fix: 修复重新上报任务状态不一致 (#91)

This commit is contained in:
chengma
2026-08-10 11:18:06 +08:00
parent d81aa25b13
commit 077cba6831
7 changed files with 352 additions and 27 deletions
+9
View File
@@ -373,6 +373,15 @@ def build_idempotency_key(
2. **键一旦入库就不能变。** 重试是拿库里存的键去发,不是现算一个。
3. **键相同,内容也必须相同。** 同一个键发不同内容,Admin 会返回 `409 IDEMPOTENCY_CONFLICT`。内容真的变了,说明这是一次新的执行,应该用新的 `attempt_id`。
### 5.3 重新上报不能覆盖最新执行状态
“重新上报”只重发已经保存在 Outbox 的原始事件,不创建新事件。选择和状态更新遵守下面四条:
1. 任务存在 `pending`、`sending` 或 `failed` 事件时,优先处理最早一条未发送事件,包括 `task_failure`;全部已发送时,才重发最新结果。
2. 重发时继续使用事件原有的 `idempotency_key` 和 `payload_json`,不能重新组装。
3. 已经发送过的历史结果再次得到 Admin 确认,只更新该 Outbox,不把任务主状态改成“已完成”。
4. 只有事件的 `attempt_id` 等于最新 `task_runs.attempt_id` 时,事件才可以更新任务主状态。最新失败事件上报成功后恢复对应失败状态;旧失败事件不能覆盖新成功结果。
## 6. `app_settings`
保存非敏感设置和设置版本。