简单抢购系统设计

面试或者工作中经常能遇到类似于抢购或者是并发争夺默写限量资源的需求,有一些想法但是比较乱,这里刚好整理一下。


一个抢购活动主要由这几部分组成

        1.页面刷新-刷新时间/可购买数量

        2.下单-争夺购买资格

        3.支付-更新订单状态


页面刷新处理办法:

    1.页面静态化

    2.反向代理缓存静态页面

    3.所需动态参数通过接口获得,不要经过框架渲染

    4.提供参数的接口不要由查询数据库的操作,所有抢购参数全部放在内存或者缓存中


下单处理办法:重点

    1.过滤器过滤请求(可以视抢购是否真的很大的并发量选择开启):主要是考虑以某种假随机的方式过滤掉一部分请求,例如获取随机数在某个范围内才允许继续抢购/IP尾号为某几个数才允许继续抢购

    2.过滤器过滤掉恶意请求:限制某一账号频繁请求/某一账号第一次进入抢购后进行记录,再次进入则在过滤器处拦截返回提示抢购中;限制某一IP频繁请求对IP一秒内请求5-10次的拉入黑名单30秒/60秒,此情况可返回线路繁忙/抢购繁忙

    3.占用库存:重点

    单点系统用内存,分布式可以用缓存,将此次抢购商品数量放入其中。或者采用占用资格即增加的方式,维护库存。

    经过上面一系列的拦截过滤,假设有10件商品参与抢购,有1000个用户参与到抢购活动中来,前面两种过滤后期望剩余用户数为100。

    单点系统调用同步方法(没测试过)对内存中的库存进行操作。

    分布式方法可以对redis的key进行incr或decr维护缓存中的库存。

    占用库存成功的将继续生成订单即支付,未有机会执行占用库存的,需要对库存进行判断,如果大于等于抢购数量则返回抢购失败。

    4.下单:可异步生成订单,直接返回抢购成功,请去订单列表支付(体验不太好)。或者就同步生成订单,跳转订单页面进行支付。


支付处理办法:

    1.与银行支付通讯必须是同步的,如果有notify,则在notify结束后修改订单状态。


记录一下,以后会补上一个简单抢购系统的详细代码实现。

阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页