订单系统设计 —— 重复下单

一、重复原因

  造成重复下单的原因有很多,比如用户重复提交、网络超时导致的重试(网关超时重试、RPC超时重试,以及前端超时重试等),下单请求的整个链路都可能造成重复,大致可以分成如下三类:

  1. 用户重复提交;
  2. 恶意刷单;
  3. 网络原因导致的超时重试;
    在这里插入图片描述

二、产品方案

  如何防止用户重复下单,并不只是技术的事情,因为技术并不一定能百分百的考虑到所有可能重复的场景,必须依靠产品+技术共同的努力,以及运营、客服等订单重复时的事后处理。

  1. 用户点击”提交订单“按钮后,对按钮置灰,禁止再次提交;
  2. 对于涉及金额比较大的订单,需要弹窗二次确认;
  3. 对用户的下单频率、次数进行限制;

三、技术方案

  用户下单在逻辑上是一个非幂等行为,因此解决方案都是基于物理去重的思路设计的,用某个id表示某次下单行为,通过该id判断是否重复;

3.1 基于订单号去重

  1. 用户进入下单页面时,前端页面先调用订单服务得到一个订单号;
  2. 用户提交订单时,携带得到的订单号,向后端发送创建订单请求;
  3. 接收到创建订单请求后,订单系统校验订单号是否合法,以及是否已被缓存;
  4. 如果存在,说明订单合法,将订单号作为唯一主键在数据库中创建订单;
    在这里插入图片描述

3.2 基于唯一ID去重

  1. 用户进入下页面时,前端页面自己生成一个全局唯一的ID;
  2. 用户提交订单时,在创建订单的请求中带着这个ID;
  3. 接收到下单请求后,订单服务首先会利用缓存的CAS操作设置ID;
  4. 如果之前不存在则成功,数据库创建订单;如果已经存在则返回;
    在这里插入图片描述

参考:

  1. https://cloud.tencent.com/developer/article/1121727
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值