课程 281 / 365
77%
数据结构与算法直觉·练习·18 分钟
正文已完成

设计一个可恢复的任务队列

交付含状态、重试、幂等和人工接管规则的小型队列方案。

L281

能把任务排成队不等于可靠。消费者可能在处理一半时崩溃,任务可能被重复投递,失败也可能永久卡住。一个可恢复队列至少要定义状态、确认时机、重试边界与人工接管。

这一课的结果

能设计一个不会因进程中断而悄悄丢任务的队列状态模型。

核心概念

先把关键判断说清楚

01

状态必须可持久化

queued、running、succeeded、failed 等状态要保存在进程外,重启后才能知道哪些任务尚未收口。

02

至少一次意味着会重复

许多队列宁可重复投递,也要避免任务丢失,因此消费者需要幂等键或重复检测。

03

失败要有终点

重试次数、退避时间和死信队列把暂时故障与需要人工处理的问题分开。

案例拆解

生成报告任务在重启后续跑

服务在写出 PDF 前重启,旧实现已经从内存队列删除任务,用户既收不到文件也看不到失败。

  1. 01

    任务入队时写入持久存储,状态为 queued,并生成幂等键。

  2. 02

    消费者领取后改为 running,成功写入文件地址后才确认完成。

  3. 03

    超时任务按指数退避重试三次,仍失败则进入 needs_review 并通知人工。

案例结果

重启后未完成任务可重新领取,重复执行也不会生成多份对外结果。

提交前练习

现在轮到你

为一个可能耗时或失败的后台任务设计可恢复队列。

内容会自动保存在当前设备
查看参考答案与评分标准

参考答案

任务是发送结算通知;状态 queued/running/sent/failed/review;幂等键为账期+客户 ID;网络错误按 1、5、20 分钟重试三次,参数错误不重试;进入 review 时附请求 ID、错误码和最近一次响应。

评分标准

  • 状态能覆盖中断恢复
  • 幂等键对应业务动作
  • 重试与人工接管边界明确

本课收口 · 学习证据

完成,不等于随手打一个勾。

确认阅读、保存练习,再用 30 秒检查和一句话总结留下真实学习证据。

0 / 3
02完成本课练习0 / 4 项必填内容已填写
03通过理解检查约 30 秒
消费者完成外部写入但尚未确认消息时崩溃,最需要什么保护?
你现在更接近哪一种状态?
完成上面三项后,才能把本课记为已验证。

资料来源

继续核对与延伸阅读

本课内容最近更新于