限购、限流、幂等的思考

点九博客 努力成为Web全栈工程师! 本文由博客端 http://point9.top 主动推送

一、限购

1、场景

如一商品在一次活动中,规定每人限购两份。

2、分析

商城系统用户一般都会进行实名认证,我们可以根据用户证件号进行限购处理,

或者是用户的唯一 ID 标识,或者用户注册使用的手机号等。

在用户支付出单前,根据限购标识去数据库中查询一下有效订单数量,

如大于活动限购次数,不允许支付出单。

3、实现

  1. 在调用支付接口前,调用限购接口,符合购买条件,继续支付;不符合条件,提示并改变订单状态为无效。
  2. 在订单状态修改前,调用限购接口,符合购买条件,成功生成订单号;不符合条件,提示并做退款处理,订单设置为无效。

二、限流

1、场景

场景一:不同接口不同时间段限流

场景二:针对不同产品或者不同套餐限流

2、分析

场景一:不同接口的不同时间段限流,
如支付接口在中午 12 点到 0 点订单量较大,接口的限流白天时段可以开放大些。

0 点以后可以少些,可以做到恶意防刷,当然你们系统肯定也有黑名单管控。

场景二:针对不同产品或者不同套餐限流

如针对产品进行不同限流,IPone 11 PRO Max 手机活动中每人限购 2 个,手机壳每人限购 5 个。我们产品维度根据用户唯一 ID 进行并发数限制。

3、实现

场景一:每个接口请求前,判断是否超出最大流量限制。

场景二:在调用下单接口前,判断用户 ID 是否超出该产品允许的最大并发数(此时一般为并发数)。

三、幂等

1、场景

每次请求流水号不同,相同流水号的请求,返回相同的响应信息。

2、分析

做请求幂等处理

幂等字段 默认流水号(可自定义用户 ID 或者证件号或 IP+ 手机码等)

报文类型 默认 JSON 字符串 (可以是 XML)

限购份数 默认为 1(每人每次允许发起的最大请求次数)

缓存时间 默认一小时 (根据幂等字段查询缓存数据,返回已有重复请求)可以是活动的最大时间

3、实现

基于自定义注解实现

赞助商 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • dianjiu

    🙏 后续会有代码实例