五厂面经真题集腾讯面经高频腾讯真题任务队列幂等性速答 · 约 5 分钟更新 2026-09-29

怎么设计任务队列,让长任务可取消、可恢复且不重复产生副作用?

一句话结论

用状态机管理任务,用检查点读取取消标记,用步骤级日志保存进度;恢复时先查幂等键对应的外部操作是否已生效,再决定是否执行,避免长任务中断后重复产生副作用。

先这样答

我会给每个队列任务配一套状态机,用排队、执行、取消中、完成、失败表示任务进展。任务不直接依赖一个不可分割的长过程,而是按步骤执行,并在步骤之间检查取消标记。这样,取消请求可以让任务在安全的步骤间隙停下来。

任务要恢复,就把步骤级进度持久化。任务再次执行时,先读取已经完成到哪一步,再从未完成的步骤继续。取消和恢复使用同一套步骤日志。取消记录会留下任务停在哪个步骤,恢复也从这份记录接着判断。

每个可能产生外部副作用的操作都带幂等键。恢复某一步前,先查询这个操作是否已经生效;如果已经生效,就不再次执行,如果还没有生效,再执行并记录结果。状态机、步骤日志、取消标记和幂等键一起工作,才能同时处理取消、恢复和副作用不重复。

面试官会怎么追问

  • 「为什么要在步骤间隙检查取消,而不是立即终止任务?」 任务执行到某个步骤时,不能只靠任务状态判断是否结束。检查点让任务在步骤之间读取取消标记,并把状态转为取消中。这样,取消和步骤执行可以通过同一套日志衔接起来。

  • 「恢复时为什么要保存步骤级进度?」 只保存任务整体状态,无法知道任务已经完成了哪些步骤。恢复时读取步骤日志,就能从未完成的步骤继续执行。取消和恢复共用这套日志,任务可以沿着同一份进度记录继续处理。

  • 「幂等键具体怎么避免重复副作用?」 外部操作执行前先绑定幂等键。恢复某一步时,先查询这个幂等键对应的操作是否已经生效。已经生效就跳过再次执行,未生效才执行该操作。

回答的坑

只保存任务整体状态,不保存步骤级进度,恢复时就无法准确判断从哪一步继续。

恢复时直接重做未确认步骤,却不先查询幂等键对应的外部操作,可能重复产生副作用。

—— 本题完 ——