SAG / ARCHITECTURE NOTE

幂等性、任务队列与用量账本:确保重复执行仍能得到正确结果的运营设计

介绍如何设计幂等键、状态转换和用量账本,确保即使发生网络重试或重复点击,任务和计费也只会生效一次。

下载Markdown

面向生产环境的服务会收到同一请求多次

用户可能会重复点击按钮,或者网络中断后,客户端重新发送请求。无服务器函数也可能在处理过程中终止,随后再次运行。在这样的环境中,如果一次请求导致创建两项任务或重复扣减用量,就很难让人信任结果。

幂等性是指重复提交表达同一意图的请求时,最终效果只发生一次。SAG 会为创建和执行请求关联逻辑上的幂等键;如果该键对应的请求已在处理中或已完成,则返回已有结果。

明确管理任务状态

对于耗时较长的检查,与其在请求处理中完成,不如交由任务队列并管理其状态,这样更安全。

  • queued:等待执行
  • running:工作进程正在处理
  • succeeded:结果和结算均已完成
  • failed:可重试的失败状态
  • dead-letter:已超过自动重试上限,需要运营人员检查的状态

状态转换必须在数据库中以原子方式处理,以免两个工作进程同时领取同一项任务。还应一并记录重试次数和下次执行时间,以便区分暂时性的外部故障与持续性错误。

用量应记录为账本,而不是单个数值

如果只覆盖当前用量数值,就很难查明用量何时因哪项任务而增加。用量账本会将预留、确认和取消分别记录。任务开始时预留额度,成功后确认;如果在执行前失败,则撤销预留。同一任务键只允许结算一次。

在运营验证中覆盖失败情形

除了正常成功之外,还应测试重复提交、工作进程冲突、超出限额、失败后重试,以及完成后再次提交相同请求。幂等性和账本虽然不是用户直接看到的功能,却是防止“我明明只点了一次按钮,为什么被扣了两次?”这类运营事故的核心架构。

按主题查阅技术参考资料

延伸阅读

了解租户权限、任务重试、缓存和审批记录。

文章列表