幂等性指的是什么
幂等(idempotent)在自动化语境里指:以同样的输入重复执行同一操作,系统最终状态不会因为多执行了几次而发生额外变化。判定的关键是对「期望状态」而言,不是对命令的返回码而言。例如「确保目录存在」重复执行结果一致,是幂等的;「在配置文件末尾追加一行」重复执行会堆出多行,是非幂等的,即使每次执行都返回成功。自动化任务之所以强调幂等,是因为重试、断点续跑、并发触发都会造成同一条任务被执行多次。
基本信息
| 判定对象 | 一条任务、一个模块调用或一次接口请求 |
|---|---|
| 判定标准 | 重复执行后最终状态与首次执行后一致 |
| 天然幂等 | 设定状态类操作,如确保存在、确保为某值 |
| 天然非幂等 | 追加、自增、一次性创建、对外发送类操作 |
判定三问
- 第一问:重复执行后,文件、配置或数据会不会多出副本或叠加内容。
- 第二问:操作是否依赖执行前的现场状态,而重复执行会改变这个现场。
- 第三问:外部副作用(发通知、扣额度、建工单)会不会被重复触发且无法撤销。
常见操作判读
| 操作 | 幂等 | 原因 | 幂等化手段 |
|---|---|---|---|
| 确保目录存在 | 是 | 结果只有存在与不存在两种 | 无需改造 |
| 覆盖写配置 | 是 | 每次写入内容相同 | 配合模板渲染 |
| 追加一行配置 | 否 | 重复执行会累积重复行 | 改为整文件渲染或先匹配再写入 |
| 计数器自增 | 否 | 每次执行都会改变数值 | 改为设定目标值或引入唯一键 |
| 确保服务运行 | 是 | 状态只有运行与停止 | 调用状态型模块 |
| 发送告警通知 | 否 | 重复发送会打扰接收方 | 加去重键或状态判断 |
删除类操作的幂等性要单独确认:多数实现是「目标不存在则视为成功」,但也有些工具会把「目标不存在」当成错误返回,导致重试时任务失败。改造前先查清所用工具对缺失对象的行为。
幂等性判定要在同一份期望状态的前提下进行:把期望值从 1 改成 2,再执行一次导致变化,这不叫非幂等,而是期望状态发生了变更。