京东抢购服务高并发实践 世界热头条 - 行业资讯 -

当前位置:首页  >  行业资讯  > 正文

京东抢购服务高并发实践 世界热头条

京东抢购服务高并发实践 世界热头条
2023-05-07 17:26:50 来源:清一色财经

限时抢购又称闪购,英文Flash sale,起源于法国网站Vente Privée。

服务介绍


(资料图)

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

模式特征:

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

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

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

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

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

服务主要功能

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

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

针对哪些SKU

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

主要渠道

移动APP、微信、手Q和主站

限购类型

限数量、限ip、限pin和限制ip与pin

系统设计要点

如何实现实时库存?

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

如何设计抢购redis数据结构?

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

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

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

如何保证不超卖?

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

localkey=KEYS[1]localtag="b"localnum=tonumber(ARGV[1]);locallastNum=redis.call("HINCRBY",key,tag,-num);if业务性判断ortonumber(lastNum)==0thenreturnlastNumend

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

如何提高吞吐量?

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

如何保证可用性?

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

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

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

系统架构

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

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

抢服务流程

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

REDIS+LUA抢购子流程:

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

q.lua伪代码:

--[[--!@brief促销Id下限流:可以防止某个促销过热导致服务不可以用--]]localfunctionlimited()--todo:实现end--[[--!@brief限制逻辑(ip和pin):比如有的促销是限制ip,这里校验ip是否存在,如果为限ip类型抢购活动,存在抛出异常告知ip已经存在不能抢购--]]localfunctioncheck_ip_pin()--todo:实现end--[[--!@brief记录订单号:主要目的实现抢方法幂等性,调用方网络超时可以重复调用,存在订单号直接返回抢购成功,不至于超卖--]]localfunctionrecord_order_id()--todo:实现end--[[--!@brief扣减剩余数--]]localfunctionscalebuy()--locallastNum=redis.call("HINCRBY",key,tag,-num);--end--调用顺序不可调整--1限流localstatus,msg=limited()ifstatus==0thenreturnmsgend--2校验status,msg=check_ip_pin()ifstatus==0thenreturnmsgend--3记录订单status,msg=record_order_id()ifstatus==0thenreturnmsgend--4扣减剩余数status,msg=scalebuy()ifstatus==0thenreturnmsgend--5返回成功标示return1

子流程具体如下:

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

2、获取系统初始化时SCRIPT LOAD加载q.lua返回的串shaValue;

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

//其他操作Pipelinep;//初始化pp.evalsha(shaValue,keyList,argList);//其他操作

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

补充:详细Script操作可以参考Jedis中 ScriptingCommandsTest。

JMQ发送子流程:

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

资格回滚子流程:

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

限流处理

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

privatestaticAtomicIntegeratomic=newAtomicInteger(0);publicvoidtest(){try{//限流intlimitNum=XXX.getLimitNum();intnowConcurrent=atomic.incrementAndGet();if(nowConcurrent>limitNum){//异常处理}//正常业务逻辑}catch(Exceptione){//异常处理}finally{atomic.decrementAndGet();}}

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

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

作者:张子良,京东高级开发工程师,在京东负责抢购后端服务系统架构和开发工作。

【本文来自清一色专栏作者张开涛的微信公众号(开涛的博客),公众号id: kaitao-1234567】

戳这里,看该作者更多好文

标签:

(责任编辑:news01)
昆明高新区生物医药产业发展驶入快车道|当前短讯

昆明高新区生物医药产业发展驶入快车道|当前短讯

新华网昆明5月5日电(记者浦超)拥有昆明市80%生物医药企业的昆明国家高新技术产业开发区(简称“昆明高新
05-05 10:16:51
每日精选:金桥信息5月5日盘中涨停

每日精选:金桥信息5月5日盘中涨停

以下是金桥信息在北京时间5月5日09:58分盘口异动快照:5月5日9点58分,金桥信息盘中涨停,报16 2元,目前封
05-05 09:55:18
中华企业:拟转让申阳滨江75%的股权及相关债权

中华企业:拟转让申阳滨江75%的股权及相关债权

中华企业:拟转让申阳滨江75%的股权及相关债权-转让完成后,公司将不再持有申阳滨江的股权。
05-05 09:31:00
天天微速讯:美媒:美国银行业危机持续 近190家银行面临倒闭风险

天天微速讯:美媒:美国银行业危机持续 近190家银行面临倒闭风险

美媒:美国近190家银行面临倒闭风险
05-05 09:11:17
贵州财经大学创新创业园:创业孵化助力青年创业“圆梦”_全球快播报

贵州财经大学创新创业园:创业孵化助力青年创业“圆梦”_全球快播报

28岁的杨正泉算了一笔账,入驻贵州财经大学创新创业园的第4年,年收入达到了30万元。此时,他还是一名会计
05-05 08:39:53
世界球精选!【江西省检察院】举办刑事司法业务同堂培训班

世界球精选!【江西省检察院】举办刑事司法业务同堂培训班

本报讯(通讯员刘承烺)为扎实开展主题教育,进一步提升刑事司法人员政治素质、业务素质、职业道德素质,日
05-05 08:01:57
翻译:萨巴伦卡:第2次进WTA1000马德里争冠赛,手感超好忍不住夸自己

翻译:萨巴伦卡:第2次进WTA1000马德里争冠赛,手感超好忍不住夸自己

萨巴伦卡志在夺取个人WTA1000赛事的第5+生涯第13+2023赛季第3冠。事实上,马德里是萨巴伦卡本赛季目前的第5
05-05 07:51:36
剑网3挖宝脚本_剑网3挖宝

剑网3挖宝脚本_剑网3挖宝

1、绿色材料,一般一开始挖的都是这些,当然,大部分人其实挖出来的都是这些;2、蓝色材料,挖了几次之后,或许可
05-05 06:16:43
英超:曼联0-1惨遭布莱顿绝杀 三笘薫失单刀卢克肖补时送点|天天速看

英超:曼联0-1惨遭布莱顿绝杀 三笘薫失单刀卢克肖补时送点|天天速看

英超:曼联0-1惨遭布莱顿绝杀三笘薫失单刀卢克肖补时送点,英超,曼联,布莱顿,卢克肖,拉什福德,维尔贝克,英国
05-05 04:56:30
面积单位之间的进率课件_面积单位之间的进率 当前快看

面积单位之间的进率课件_面积单位之间的进率 当前快看

1、长度单位:厘米、分米、米,每相邻两个单位之间的进率是10.面积单位:平方厘米、平方分米、平方米,每
05-05 03:43:15
全球通讯!韦达定理求根公式口诀 韦达定理求根公式

全球通讯!韦达定理求根公式口诀 韦达定理求根公式

今天来聊聊关于韦达定理求根公式口诀,韦达定理求根公式的文章,现在就为大家来简单介绍下韦达定理求根公式
05-05 01:07:19
老叶较真丨女子凌晨打车回家说绕行6公里,司机喊冤到底以哪个路线为准?_天天微头条

老叶较真丨女子凌晨打车回家说绕行6公里,司机喊冤到底以哪个路线为准?_天天微头条

5月3日凌晨,市民左女士从虹桥火车站打车回闵行区闵浦新苑某村的家,到达目的地后,出租车师傅按照40公里收
05-04 23:00:28
2023年陕西省大学生足球联赛盛大启航

2023年陕西省大学生足球联赛盛大启航

4月26日,陕西省大学生足球联赛暨“英才汇聚,我爱西安”活动开幕式在西安奥体中心隆重召开。本次活动由...
05-04 22:01:47
世邦魏理仕:2023-2026年中国香港将较新加坡增逾10%的写字楼供应_环球今日报

世邦魏理仕:2023-2026年中国香港将较新加坡增逾10%的写字楼供应_环球今日报

报告预计,于2023至26年间,中国香港将较新加坡增加逾10%写字楼空间,进一步增加两地写字楼市场规模的差距。
05-04 21:30:43
环球最资讯丨三山五园来历_三山五园是什么

环球最资讯丨三山五园来历_三山五园是什么

1、北京的“三山五园”指的是:三山—万寿山、香山、玉泉山,三座山上分别建有静明园、静宜园、颐和园,...
05-04 20:56:05
每日视讯:西北望看台:阿根廷足协邮件确认来华踢2场,对阵还存在变动

每日视讯:西北望看台:阿根廷足协邮件确认来华踢2场,对阵还存在变动

直播吧5月4日讯网易旗下体育媒体“西北望看台”消息,阿根廷足协刚刚确认,今年6月将前往中国进行热身赛...
05-04 19:59:34
以青春之名 励青春之志

以青春之名 励青春之志

03:22青年是一种精神而并非定义,你我皆是时代锋芒,无所畏惧。心怀理想,所向披靡。时间很漫长,岁月却很
05-04 19:06:59
怎么改变电脑色彩_电脑色彩怎么恢复 最新消息

怎么改变电脑色彩_电脑色彩怎么恢复 最新消息

1、1,是你主机的显示屏插头没插好,这个网吧经常有。2、2,是你显示屏有问题,按显示屏上的那几个键就可以
05-04 19:00:09
2023年中国公路自行车联赛(铜仁站)将于5月12日举办|环球快播

2023年中国公路自行车联赛(铜仁站)将于5月12日举办|环球快播

央广网贵阳5月4日消息(见习记者栾小琳)5月4日,记者从2023年中国公路自行车联赛(铜仁站)暨环梵净山公路自
05-04 18:21:46
每日快报!皮肤瘙痒用什么药止痒效果最好_皮肤瘙痒该怎么办

每日快报!皮肤瘙痒用什么药止痒效果最好_皮肤瘙痒该怎么办

1、经常有朋友和患者问,冬天皮肤痒怎么办?我用一个防治瘙痒的思维导图给你说清楚!赶紧分享给身边的朋友
05-04 17:45:47
环球快资讯:创历史新高 成都航空枢纽“五一”假期运送旅客109.3万人次

环球快资讯:创历史新高 成都航空枢纽“五一”假期运送旅客109.3万人次

记者从四川机场集团获悉,今年“五一”假期(4月29日至5月3日),成都航空枢纽共完成运输起降7690架次,...
05-04 17:29:58
(图片故事)种蓝莓的“新农人”-全球快播

(图片故事)种蓝莓的“新农人”-全球快播

整个“五一”假期,“85后”的吕欣没有休息,每天在家庭农场的大棚中忙碌。她是天津市西青区辛口镇一位...
05-04 17:07:53
环球看点!大连电瓷:子公司预中标5510万元国家电网项目

环球看点!大连电瓷:子公司预中标5510万元国家电网项目

大连电瓷(002606)5月4日晚间公告,全资子公司大瓷材料为国家电网采购项目推荐中标候选人,共计预中标金额为
05-04 16:39:22
四川宜宾兴文县发生4.9级地震 目前暂未收到人员伤亡情况 世界热闻

四川宜宾兴文县发生4.9级地震 目前暂未收到人员伤亡情况 世界热闻

地震发生后,宜宾市消防救援支队地震重型队22车91人迅速集结,兴文县消防救援大队前突小队立即前往灾区侦察
05-04 16:24:24
小鸡宝宝考考你珍珠奶茶里的“珍珠”一般是什么做成的_天天热头条

小鸡宝宝考考你珍珠奶茶里的“珍珠”一般是什么做成的_天天热头条

珍珠奶茶里的“珍珠”一般是什么做成的?这是支付宝中蚂蚁庄园玩法12月8日小课堂的问题,答对即可获得一...
05-04 15:53:15
天天时讯:专业取名网站nameberry_专业取名网站

天天时讯:专业取名网站nameberry_专业取名网站

1、是中国起名网。2、也是目前最专业。3、最权威的。以上就是【专业取名网站nameberry,专业取名网站】相关
05-04 15:25:38
每日快播:盘存报表怎么做_盘存表模板

每日快播:盘存报表怎么做_盘存表模板

1、审计要求交这两张表,但是帐上没有发生额,这2张表还交不?另外年审审计和 存货表当年没有发生额那盘点表
05-04 14:50:01
河南辉县百泉学校“叮咚文学社”获评第十届全国“百佳校园文学社团” 全球短讯

河南辉县百泉学校“叮咚文学社”获评第十届全国“百佳校园文学社团” 全球短讯

2023年4月27日至28日,第十届校园文学研究会暨文学教育成果展评交流会在山东临沂市七中召开。河南省两所学
05-04 14:15:53
上海车展,国产电车令人忧心的四个事实与真相

上海车展,国产电车令人忧心的四个事实与真相

硬实力上的差距决定短跑与长跑选手在不同阶段的表现会不一样。
05-04 13:44:58
继承法第二顺序继承人可以继承吗 环球速递

继承法第二顺序继承人可以继承吗 环球速递

第二顺序继承人可以继承,应当明确,继承法已经失效,现存有效的关于继承的法律为民法典,在没有第一顺序继
05-04 12:56:37

为您推荐

精彩推送