什么是幂等性?哪些操作需要幂等性?

讨论了幂等性的定义及其在 HTTP 请求中的应用,涉及 GET、POST、PUT 和 DELETE 方法的特点。

网络协议 中等 HTTP 幂等性 HTTP请求

幂等性 的定义

幂等性是一个分布式系统和网络协议中的重要概念,指任意一次或多次执行操作,所产生的结果与单次执行结果一致,且不影响系统状态。其核心在于同一操作无论重复请求多少次,都只产生预期的单次影响。例如,在支付系统中,成功扣款后由于网络异常导致重试时,幂等性可确保不会多次扣款。幂等性本质保证了操作的“一次性”,避免重复操作引发数据不一致。

需要幂等性 的操作类型

在设计和实现网络协议时,某些操作必须考虑幂等性来解决重复请求问题,可分为两类:HTTP 请求操作和常见业务场景操作。

  1. HTTP 请求操作方法 (基于协议特性)
    • GET 请求: 天然支持幂等性。用于获取数据操作,多次查询不改变资源状态(例如:SQL SELECT * FROM users WHERE id=1)。因此,任何仅检索资源的操作默认视为幂等。
    • POST 请求: 非幂等操作;多次调用可能多次创建新资源,导致系统状态变化 (如:INSERT into database)。因此,需要在设计时实现幂等解决方案 (例如通过 token 机制唯一标识每次请求)。
    • PUT 请求: 部分支持幂等性。若操作执行绝对值更新则幂等(例如:HTTP PUT item 设置为固定值);但增量操作不幂等(例如:SQL SET price = price + 10),需人工实现检测。
    • DELETE 请求: 天然支持幂等性;操作基于唯一标识执行删除,多轮删除不影响状态(例如:DELETE /resourse/101)。
  2. 业务场景操作 (高风险或状态变更)
    • 状态修改动作:如账户余额操作 (支付/转账)、数据写入库存记录、订单处理或状态流转更新等。需幂等确保重试时不可重复影响资源变化。
    • 外部干扰或高并发操作:场景包含用户重复点击(提交按钮多次操作)、网络延迟重发、或消息队列消费者处理,例如:
      • 新建业务订单时,若订单无唯一索引(数据库主键)则需保证多次调用只创建一次。
      • 敏感操作如消息推送(用户收到同一短信不崩溃)或优惠券发放,要求单次执行生效。
      • MQ 消费更新(系统日志异常后补偿任务时),应无副作用重复调用(流程设计一锁二判三更新为框架方案)。

在实践中,需考虑业务属性(系统状态是否会被改变和存在被重复调用的可能)来判断是否要求幂等设计。