|
|
|
@ -29,7 +29,7 @@ waynboot-mall是一套全部开源的微商城项目,包含一个运营后台
|
|
|
|
|
16. ...
|
|
|
|
|
|
|
|
|
|
## 商城难点整理
|
|
|
|
|
#### 1. 下单流程,库存扣减操作是在下单操作扣减还是在支付成功时扣减?(ps:扣减库存使用乐观锁机制 `where goods_num - num >= 0`)
|
|
|
|
|
#### 1. 库存扣减操作是在下单操作扣减还是在支付成功时扣减?(ps:扣减库存使用乐观锁机制 `where goods_num - num >= 0`)
|
|
|
|
|
1. 下单时扣减,这个方案属于实时扣减,当有大量下单请求时,由于订单数小于请求数,会发生下单失败,但是无法防止短时间大量恶意请求占用库存,
|
|
|
|
|
造成普通用户无法下单
|
|
|
|
|
2. 支付成功扣减,这个方案可以预防恶意请求占用库存,但是会存在多个请求同时下单后,在支付回调中扣减库存失败,导致订单还是下单失败并且还要退还订单金额(这种请求就是订单数超过了库存数,无法发货,影响用户体验)
|
|
|
|
@ -90,6 +90,16 @@ searchSourceBuilder.from((int) (page.getCurrent() - 1) * (int) page.getSize());
|
|
|
|
|
searchSourceBuilder.size((int) page.getSize());
|
|
|
|
|
List<JSONObject> list = elasticDocument.search("goods", searchSourceBuilder, JSONObject.class);
|
|
|
|
|
```
|
|
|
|
|
#### 4. 订单编号生成规则:秒级时间戳 + 加密用户ID + 今日第几次下单
|
|
|
|
|
1. 秒级时间戳:时间递增保证唯一性
|
|
|
|
|
2. 加密用户ID:加密处理,返回用户ID6位数字,可以防并发访问,同一秒用户不会产生2个订单
|
|
|
|
|
3. 今日第几次下单:便于运营查询处理用户当日订单
|
|
|
|
|
|
|
|
|
|
#### 5. 下单流程处理过程,通过rabbitMQ异步生成订单,提高系统下单处理能力
|
|
|
|
|
1. 用户点击提交订单按钮,后台生成订单编号和订单金额跳转到订单支付页面,并发送rabbitMQ消息(包含订单编号等信息)
|
|
|
|
|
2. 订单消费者接受到订单消息后生成订单记录(未支付)
|
|
|
|
|
3. 用户点击支付按钮时,前端根据订单编号轮询订单信息查询接口,如果订单编号记录已经入库则进行后续支付操作,如果订单编号未入库则返回错误信息(订单异常)
|
|
|
|
|
4. 用户支付完成后在回调通知里更新订单状态为已支付
|
|
|
|
|
- todo
|
|
|
|
|
|
|
|
|
|
## 文件目录
|
|
|
|
|