标准答案
- 至少应区分 queued、running、succeeded、failed、cancelled 等状态,并记录创建、开始、结束和最后错误。
- 提交成功只表示任务已持久化或进入可靠队列,不表示业务已经完成;状态接口要有权限校验。
- 未开始任务可以取消,运行中任务只能发送取消信号;已提交的不可逆副作用需要通过对账或补偿处理。
- 超时应有明确的任务状态和后续策略,不能让调用方超时后任务永远停留在 running。
题目解析
异步接口把一次请求拆成受理、排队、执行和结果确认几个阶段,因此状态必须能表达“尚未开始”“正在执行”“已完成”和“结果未知”。只把同步代码丢到后台线程,进程重启后仍可能丢失任务状态。
202 只表示服务接受了请求,不表示业务成功。状态查询要绑定用户或租户权限,返回最终结果、失败原因和可重试建议,并为任务设置保留期和审计记录。
取消和超时要和实际副作用对应:尚未执行的任务可以取消,已经提交的写入可能只能查询、补偿或对账。状态机必须防止客户端超时后重复创建同一业务任务。
常见误区
- 误区:返回 202 就等于任务完成。改正:提供受权限保护的状态查询和最终结果,并明确“已受理”与“成功”的区别。
- 误区:调用方超时就直接把任务标为失败。改正:服务端可能仍在执行,应先发送取消并确认结果,不能让状态与真实副作用脱节。
- 误区:任务状态永久保留或永久停留 running。改正:设计过期清理、租约恢复、失败告警和审计字段,保证崩溃后能继续判断。