At-Least-Once Delivery
至少投递一次
至少投递一次会尽量避免消息丢失,但同一条消息可能送达不止一次。消费者必须能安全处理重复消息。
deliver -> process -> acknowledge/delete; missing acknowledgement -> redeliver; event ID -> dedupeevt_784deliver -> process -> acknowledge/delete; missing acknowledgement -> redeliver; event ID -> dedupeJOB另一个例子
工作进程已经保存收据 `evt-42`,却在删除 Amazon SQS 消息前停止。SQS 之后再次投递同一条消息。下一个工作进程看到已保存的事件 ID,就返回原收据,不会再生成一份。
主要部分
- 01稳定消息 ID
- 02投递尝试
- 03工作进程产生的结果
- 04确认或删除消息
- 05重新投递路径
- 06重复处理记录
什么时候用
丢失一项任务比重复处理更糟时,可以采用这种规则。每条消息要有固定 ID。同一条消息再次送达时,不可多扣款、多发邮件或多存一份。
什么时候不要用
消息送达不代表任务成功。不要承诺只会产生一次结果。扣款或外部操作都需要自己的防重复机制。
代码里的名称
deliver -> process -> acknowledge/delete; missing acknowledgement -> redeliver; event ID -> dedupe 上线前要检查
检查接口约定、任何情况下都不能破坏的规则、授权与输入限制。测试重试、重复执行只生效一次、超时与部分失败。验证数据完整性、兼容性、监控、恢复与回到上一版。
预期结果:为这套系统设计或检查 至少投递一次 (At-Least-Once Delivery),并让数据保持正确、安全且容易维护。 用户场景:工作进程已经保存收据 `evt-42`,却在删除 Amazon SQS 消息前停止。SQS 之后再次投递同一条消息。下一个工作进程看到已保存的事件 ID,就返回原收据,不会再生成一份。 技术概念或控制措施:至少投递一次 (At-Least-Once Delivery)。 适用理由:丢失一项任务比重复处理更糟时,可以采用这种规则。每条消息要有固定 ID。同一条消息再次送达时,不可多扣款、多发邮件或多存一份。 不应使用的情况:消息送达不代表任务成功。不要承诺只会产生一次结果。扣款或外部操作都需要自己的防重复机制。 工程要求:定义输入、输出、接口约定,以及任何情况下都不能破坏的规则。说明授权与输入检查范围。定义失败、超时、重试和重复执行只生效一次的规则。也要定义数据迁移与兼容限制。 运营要求:加入监控信号与隐藏敏感数据的日志。设置容量上限并写好操作手册。测试恢复与回到上一版的流程。 验收标准:接口约定与失败路径测试通过。重试或部分失败时,数据与授权规则仍正确。性能上限、监控、恢复与回到上一版的方法都已验证。 证据与限制(证据边界):没有一份官方标准能涵盖全部内容。不同团队、平台或框架的用法可能不同。 待确认:程序运行环境、数据位置、流量形态、数据一致需求和安全边界。也要确认兼容周期、服务目标(SLO)与恢复上一版的限制。
检查这份需求
请 AI 编程助手检查当前如何使用 至少投递一次 (At-Least-Once Delivery)。 定义:至少投递一次会尽量避免消息丢失,但同一条消息可能送达不止一次。消费者必须能安全处理重复消息。 生产环境检查:检查接口约定、任何情况下都不能破坏的规则、授权与输入限制。测试重试、重复执行只生效一次、超时与部分失败。验证数据完整性、兼容性、监控、恢复与回到上一版。 修改程序前,先列出看到的证据、缺口、严重程度,以及最小且安全的修正。