混用的代价
同一条任务里既有「确保目录存在」这类幂等动作,又有「往日志文件追加一条记录」「给计数器加一」「发一条通知」这类非幂等动作时,任务整体变成非幂等。重试、断点续跑、误触发都会让非幂等部分重复执行,产生的重复数据或重复通知往往在很久之后才被发现。更麻烦的是排查:幂等部分不报错,非幂等部分也不报错,只是结果不对。
基本信息
| 幂等部分 | 状态设定类动作,重复执行结果一致 |
|---|---|
| 非幂等部分 | 追加、自增、创建唯一资源、对外发送 |
| 混用后果 | 整条任务不可安全重试 |
| 处理原则 | 分任务管理,并为非幂等步骤加保护 |
拆分与保护方式
- 拆任务:幂等操作与一次性操作分成不同任务,任务名写清属性。
- 加唯一键:创建资源时带唯一标识,重复创建被拒绝而不是产生副本。
- 状态标记:非幂等步骤执行前先检查标记,已执行则跳过。
- 后置校验:执行后核对结果数量或内容,发现重复及时修正。
- 限制重试:非幂等任务默认不自动重试,失败交由人工判断。
- 记录副作用:把对外发送、计费类动作单独记录,便于对账。
混用场景与处置
| 场景 | 风险 | 处置 |
|---|---|---|
| 配置收敛与追加日志同任务 | 重跑产生重复记录 | 拆任务,追加动作单独管理 |
| 创建资源与发通知同任务 | 重试导致重复通知 | 通知加去重键或移到任务末尾 |
| 扩容与计数上报同任务 | 计数被重复累加 | 改为上报绝对值而非增量 |
| 申请证书与写入配置同任务 | 重试触发多次申请被限流 | 申请与写配置分离并加幂等判断 |
| 清理与删除记录同任务 | 记录被重复删除或误删 | 删除操作加存在性判断 |
非幂等操作不要放进带自动重试的任务里:重试机制会把副作用成倍放大,且被管系统通常无法自动撤销已经产生的副作用。
判断一条任务能否安全重试,最直接的方法是问:把这条任务连续执行三次,被管系统会有什么变化。答不上来就说明混用了非幂等操作。