知识卡片
幂等性的重要性:天然幂等操作与需要设计幂等性的操作
内容
幂等操作指”可以多次执行而不改变第一次执行结果的操作”。分布式系统里重复调用不可避免——[[发件箱模式与工作流引擎替代方案至少一次语义]]描述的”至少一次”语义、以及同步API的刻意重试、消息系统的重新投递,这些应对远程通信不可靠性的必要策略,迟早都会导致同一个操作被重复调用,因此每个远程操作的幂等性都必须提前认真考虑,而不是遇到问题才补救。有些操作天生就是幂等的:查询没有副作用,可以随意重试(但幂等不代表结果完全相同——几秒后系统状态可能已变化,查询结果自然会不同);删除通常也是幂等的,无法对同一个实体删两次,只是重试可能返回”找不到该实体”的错误而不是”删除成功”。但另一些操作本质上不是幂等的,典型如信用卡扣费——常见对策是让客户端生成一个唯一ID随请求一起发给扣费服务,如果服务自己保有状态记住已处理过的调用,就能识别出重复请求;无状态服务在这方面天然面临挑战,往往需要额外引入专门的状态来检测重复。特别要提醒的是:不要依赖业务数据本身去判断是否重复——几毫秒内出现两笔金额相同的信用卡扣费,可能是一次重试,但也可能真的是两个人同时预订了价格完全一样的机票,永远无法单凭业务数据下定论。设计任何服务API时都应该主动确保它支持幂等性——如果服务本身不提供这种保障,调用方就没有办法自行修复潜在的重复调用问题,只能靠猜测哪些调用可能重复,容易埋下隐患。一个好的工作流引擎本身就提供幂等操作:确保给定的key只会启动一个流程实例,完成任务、关联消息这类操作也天然幂等(流程实例一旦移动到下一步,同一个任务就无法被再次完成,即使模型里有循环、再次到达同一个任务,引擎也会为它分配不同的实例ID)。
参考来源
- 位置:《流程自动化实战:系统架构和软件开发视角》第9章《工作流引擎与集成挑战》"9.4 幂等性的重要性"(源文件:_epub-src/EPUB/xhtml/Section0001_0013.xhtml)
- 结论依据:原文区分查询/删除等天然幂等操作与信用卡扣费等需要客户端生成唯一ID才能检测重复的非幂等操作,明确提醒不能依赖业务数据判断重复,并说明工作流引擎自身通过流程实例key和任务完成机制天然提供幂等保障,直接支撑本卡片结论。
- 原始内容:这意味着,重复调用来实现同一个操作不会产生其他问题……在这种场景中,一个典型的策略是在客户端生成唯一的ID……建议不要依赖业务的负载来检查重复调用……一个好的工作流引擎也提供幂等操作,这样你就可以确保只为一个给定的key启动一个流程实例。