什么是幂等性?哪些操作需要幂等性?
讨论了幂等性的定义及其在 HTTP 请求中的应用,涉及 GET、POST、PUT 和 DELETE 方法的特点。
幂等性 的定义
幂等性是一个分布式系统和网络协议中的重要概念,指任意一次或多次执行操作,所产生的结果与单次执行结果一致,且不影响系统状态。其核心在于同一操作无论重复请求多少次,都只产生预期的单次影响。例如,在支付系统中,成功扣款后由于网络异常导致重试时,幂等性可确保不会多次扣款。幂等性本质保证了操作的“一次性”,避免重复操作引发数据不一致。
需要幂等性 的操作类型
在设计和实现网络协议时,某些操作必须考虑幂等性来解决重复请求问题,可分为两类:HTTP 请求操作和常见业务场景操作。
- HTTP 请求操作方法 (基于协议特性)
- GET 请求: 天然支持幂等性。用于获取数据操作,多次查询不改变资源状态(例如:SQL
SELECT * FROM users WHERE id=1
)。因此,任何仅检索资源的操作默认视为幂等。 - POST 请求: 非幂等操作;多次调用可能多次创建新资源,导致系统状态变化 (如:INSERT into database)。因此,需要在设计时实现幂等解决方案 (例如通过 token 机制唯一标识每次请求)。
- PUT 请求: 部分支持幂等性。若操作执行绝对值更新则幂等(例如:HTTP
PUT item
设置为固定值);但增量操作不幂等(例如:SQLSET price = price + 10
),需人工实现检测。 - DELETE 请求: 天然支持幂等性;操作基于唯一标识执行删除,多轮删除不影响状态(例如:
DELETE /resourse/101
)。
- GET 请求: 天然支持幂等性。用于获取数据操作,多次查询不改变资源状态(例如:SQL
- 业务场景操作 (高风险或状态变更)
- 状态修改动作:如账户余额操作 (支付/转账)、数据写入库存记录、订单处理或状态流转更新等。需幂等确保重试时不可重复影响资源变化。
- 外部干扰或高并发操作:场景包含用户重复点击(提交按钮多次操作)、网络延迟重发、或消息队列消费者处理,例如:
- 新建业务订单时,若订单无唯一索引(数据库主键)则需保证多次调用只创建一次。
- 敏感操作如消息推送(用户收到同一短信不崩溃)或优惠券发放,要求单次执行生效。
- MQ 消费更新(系统日志异常后补偿任务时),应无副作用重复调用(流程设计一锁二判三更新为框架方案)。
在实践中,需考虑业务属性(系统状态是否会被改变和存在被重复调用的可能)来判断是否要求幂等设计。