如何在京东抢购联想电脑首发抢购具体流程是什么

限时抢购又称闪购英文Flash sale,起源於法国网站Vente Privée闪购模式即是以互联网为媒介的B2C电子零售交易活动,以限时特卖的形式定期定时推出国际知名品牌的商品,一般以原价1-5折的价格供专属会员限时抢购每次特卖时间持续5-10天不等,先到先买限时限量,售完即止顾客在指定时间内(一般为20分钟)必须付款,否则商品会重新放到待销售商品的行列里

品牌丰富 —— 推出国内外一二线名牌商品,供消费者购买选择?/p>

时间短暂 —— 每个品牌推出时間短暂一般为5—10天,先到先买限量售卖,售完即;

折扣超低 —— 以商品原价1—5折的价格销售折扣力度大。

摘自【百度百科】通过這段简介相信对限时抢购有了一定的了解,我们内部称之为抢购系统

对于抢购系统来说,首先要有可抢购的活动而且这些活动具有促銷性质,比如直降500元其次要求可抢购的活动类目丰富,用户才有充分的选择性618(6.1-6.20)期间增量促销活动量非常多,可能某个活动力度特別大大多用户都在抢,必然对系统是一个考验这样抢购系统具有秒杀特性,并发访问量高同时用户也可选购多个限时抢商品,与普通商品一起进购物车结算这种大型活动的负载可能是平时的几十倍,所以通过增加硬件、优化瓶颈代码等手段是很难达到目标的所以需要专门设计的抢购系统。

创建促销服务:采销创建促销后促销管理系统审核通过后,会调用抢购系统创建促销;

抢服务:为符合条件嘚订单操作剩余数主要是扣减剩余数;

目前主要为单品促销,直降或者一口价比如:

主要渠道:移动APP、微信、手Q和主站

限购类型:限數量、限ip、限pin和限制ip与pin

这里说的库存不是真正意义上的库存,其实是该促销可以抢购的数量真正的库存在基础库存服务。用户点击『提茭订单』按钮后在抢购系统中获取了资格后才去基础库存服务中扣减真正的库存;而抢购系统控制的就是资格/剩余数。传统方案利用数據库行锁但是在促销高峰数据库压力过大导致服务不可用,目前采用Redis集群(16分片)缓存促销信息例如促销id、促销剩余数、抢次数等,搶的过程中按照促销id散列到对应分片实时扣减剩余数。当剩余数为0或促销删除价格恢复原价。

如何设计抢购Redis数据结构

采销人员发布促销后,在抢购Redis中生成一笔记录给抢服务提供基本信息。每一个促销对应一个促销id促销信息是Hashes结构。

例如促销A对应的类型为单品促銷,我们暂且认为类型值为1对应Redis中的key为C_A_1,数据结构内容类似于如下:

  b: 99 // 可抢购数量假如抢购了一个剩下了99   c: 1 // 抢购次数记录,用来限流后面会介绍到

因为扣减资格是一组操作,我们利用EVAL操作Redis剩余数实现原子化操作伪代码如下:

如上代码会返回剩余数,如果小于等於0了则没有库存了。

减少网络交互(一次抢数据通过 EVALSHA 一次性提交给Redis集群);数据库操作异步化(使用JMQ异步记录日志)

采用JSF(如何在京東抢购内部SOA框架)对外开放服务(抢服务和发布促销服务),可降级为系统自身webservice服务;

抢购系统主要依赖于Redis集群Redis采用一主三从集群方案,部署在两个机房每个集群16个分片,每两分片共用一台物理机可通过配置中心切换主从;

如果Redis挂掉了,如何恢复呢通过汇总MySQL中的抢購和取消流水日志,并恢复Redis的抢购数量

这里主要涉及抢服务架构剖析,因为它具有典型的高并发特性下面是基本架构概图:

注:此处嘚库存是可抢购数量设置,或者叫做资格/剩余数并非真正的实际库存。

Redis使用单个Lua解释器去运行所有脚本并且Redis也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或Redis命令被执行这种特性很好地解决了抢服务流程中并发带来的问题。

此流程通過lua 脚本实现我们暂时命名为q.lua(主要功能限流和扣减促销活动剩余数)。这样把抢购流程与脚本结合一次性提交给Redis减少网络交互,使得性能大大提升

  --!@brief 促销Id下限流:可以防止某个促销过热导致服务不可以用   --!@brief 限制逻辑(ip和pin):比如有的促销是限制ip,这里校验ip是否存在,如果為限ip类型抢购活动, 存在抛出异常告知ip已经存在不能抢购   --!@brief 记录订单号:主要目的实现抢方法幂等性,调用方网络超时可以重复调用,存在订單号直接返回抢购成功,不至于超卖   -- 调用顺序不可调整   -- 3 记录订单   -- 4 扣减剩余数   -- 5 返回成功标示

1、解析请求参数,根据促销Id按照JedisΦMurmurHash算法获取分片然后按照分片包装Pipeline批量发送请求参数argList;

3、执行EVALSHA,伪代码如下:

4、处理返回结果只要有一个分片失败,本次抢购就失败

执行Redis+Lua抢购子流程成功仅仅代表着操作Redis成功,发送JMQ(如何在京东抢购MQ基础服务)成功(后端异步将实时库存更新到MySQL)才算一笔抢购成功否则算抢购失败。这么设计的原因主要是保证抢购Redis和MySQL记录最终一致发送失败需要回滚Redis+Lua抢购子流程(恢复Redis的库存和抢购资格)。当然要考慮降级JMQ不可用时,直接切到JSF服务模拟JMQ也就是直接写MySQL库,前提是限流次数调小否则数据库有压力过大的风险。这样虽然用户体验下降叻但是服务依然可用。开关都在配置中心操作一分钟内生效。

发送JMQ失败必须回滚否则就出现了超卖现象,具体流程同Redis+Lua抢购子流程类姒是它的逆向流程,只不过运行脚本不同罢了

方法级限流,限流阈值通过配置中心配置一分钟生效,伪代码如下:

  // 正常业务逻輯

q.lua中促销级别的限流主要利用C_A_1中c的抢次数和阈值比对。比如促销A60秒内只能抢60000次,超过阈值60000该促销就会抢购失败

到此抢购系统的核心邏辑就介绍完了,这里边还有一些细节问题需要大家在设计时思考如限购(如每个人限购2个)、真实库存不足取消、用户取消订单归还資格、Redis挂了恢复数据、停促销(时间过期停、库存不足停)等等。


}

该楼层疑似违规已被系统折叠 

都說大概月末联想拯救者出4g版不知道好不好抢啊,如果好抢的话我就把现在这个暗影2退了不好抢我就换货。不知道首发能不能抢到啊


}

我要回帖

更多关于 如何在京东抢购 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信