记一次接口幂等性问题引发的线上事故

Alex Chen | 2026-07-26T09:38:00 | Java, Spring Boot

因为接口没做幂等性校验,用户重复点击下单按钮导致重复创建订单,分享我们的解决方案

# 记一次接口幂等性问题引发的线上事故 周末在家打游戏,突然收到告警——订单量异常飙升。打开后台一看,大量重复订单。 ## 事故原因 用户在网络慢的时候疯狂点击"下单"按钮,前端没做防抖,后端没做幂等校验,每次请求都会创建新订单。 ## 解决方案:Token机制 ```java @RestController public class OrderController { @Autowired private StringRedisTemplate redisTemplate; // 下单前先获取token @GetMapping("/order/token") public String getToken() { String token = UUID.randomUUID().toString(); // token存Redis,设置过期时间 redisTemplate.opsForValue().set( "order:token:" + token, "1", 10, TimeUnit.MINUTES ); return token; } @PostMapping("/order/create") public Result createOrder(@RequestHeader("Idempotent-Token") String token, @RequestBody OrderDTO dto) { // 用Redis的delete原子操作校验 Boolean deleted = redisTemplate.delete("order:token:" + token); if (Boolean.FALSE.equals(deleted)) { // token不存在或已使用,说明是重复请求 return Result.fail("请勿重复提交"); } // 正常创建订单 return orderService.create(dto); } } ``` 关键点:用`delete`的返回值做判断,因为它是原子操作,不存在并发问题。这比先查再删安全多了。 事故之后我们在所有写接口都加了幂等校验,再也没出过类似问题。

← Back to Blog