UUID 与幂等键:唯一编号只是起点
客户端超时后重试创建订单,即便每次生成的 UUID 都不同,系统仍可能创建重复订单。唯一性并没有解决同一次业务操作的识别问题。
问题从哪里出现
客户端超时后重试创建订单,即便每次生成的 UUID 都不同,系统仍可能创建重复订单。唯一性并没有解决同一次业务操作的识别问题。
理解核心机制
幂等键应代表同一次逻辑请求,并在重试中保持稳定。服务端还要把键、请求摘要和结果以适当事务方式保存,避免“检查没有再创建”的竞态。UUID 可以充当标识载体,但不是完整协议。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
import java.util.UUID;
public class Demo {
public static void main(String[] args) {
UUID requestKey = UUID.randomUUID();
String firstAttempt = requestKey.toString();
String retryAttempt = requestKey.toString();
System.out.println(firstAttempt.equals(retryAttempt));
System.out.println(UUID.fromString(firstAttempt).version());
}
}适用边界与常见误区
幂等键不能替代权限检查。还要定义同键不同参数、结果过期、处理中重试和故障恢复的行为,数据库唯一约束通常是重要的一层。
继续练习
画出两个并发请求使用相同键的时序图,标出必须原子完成的步骤;再考虑原请求成功但响应丢失的情况。