SpringBoot + 分布式 ID + 幂等令牌:跨服务调用防重复提交的终极方案
一、跨服务调用的重复提交噩梦 上周,一位朋友找我吐槽:他们公司的订单系统又出问题了。 用户在APP上下单,点击"提交"按钮后,因为网络延迟,页面没有立即响应,用户以为没提交成功,就又点击了一次。结果系统创建了两个相同的订单,用户收到了两条订单确认短信,商家也收到了两条订单通知。 更糟糕的是,这个问题不是第一次出现了。之前在支付、退款、发货等环节都发生过类似的重复操作问题。 "我们的系统是微服务架构,订单服务、支付服务、库存服务都是独立部署的,"朋友无奈地说,"跨服务调用的时候,很难保证操作不被重复执行。" 这样的场景,作为后端开发的你,是不是也遇到过? 二、为什么重复提交这么难解决? 在微服务架构下,重复提交问题变得更加复杂: 1. 网络不稳定 网络延迟、抖动、丢包等问题,可能导致客户端以为请求失败,从而重复发送请求。 2. 服务端处理延迟 服务端处理请求的时间过长,客户端超时后可能会重新发送请求。 3. 重试机制 为了提高系统的可靠性,很多系统都实现了自动重试机制,这也可能导致重复请求。 4. 跨服务调用 在微服务架构下,一个业务流程可能涉及多个服务的调用,任何一个环节的失败都可能导....