首页 数据库 mysql教程 如何解决秒杀的性能问题和超卖的讨论

如何解决秒杀的性能问题和超卖的讨论

Jun 01, 2016 pm 01:16 PM
如何 淘宝 电商 秒杀 解决方案

最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。

ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都懂了,等到自己出解决方案的时候发现还是有很多想不到的地方其实都没懂,再次验证了“细节是魔鬼”的理论。并且一个人的能力有限,只有大家一起讨论才能想的更周全,更细致。好了,闲话少说,下面进入正文。

一、秒杀带来了什么?


秒杀或抢购活动一般会经过【预约】【抢订单】【支付】这3个大环节,而其中【抢订单】这个环节是最考验业务提供方的抗压能力的。

抢订单环节一般会带来2个问题:

1、高并发

比较火热的秒杀在线人数都是10w起的,如此之高的在线人数对于网站架构从前到后都是一种考验。

2、超卖

任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的难题。

二、如何解决?


首先,产品解决方案我们就不予讨论了。我们只讨论技术解决方案

1、前端

面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】

A:扩容

加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。

B:静态化

将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。

C:限流

一般都会采用IP级别的限流,即针对某一个IP,限制单位时间内发起请求数量。

或者活动入口的时候增加游戏或者问题环节进行消峰操作。

D:有损服务

最后一招,在接近前端池承载能力的水位上限的时候,随机拒绝部分请求来保护活动整体的可用性。

2、后端

那么后端的数据库在高并发和超卖下会遇到什么问题呢?主要会有如下3个问题:(主要讨论写的问题,读的问题通过增加cache可以很容易的解决)

I: 首先MySQL自身对于高并发的处理性能就会出现问题,一般来说,MySQL的处理性能会随着并发thread上升而上升,但是到了一定的并发度之后会出现明显的拐点,之后一路下降,最终甚至会比单thread的性能还要差。

II: 其次,超卖的根结在于减库存操作是一个事务操作,需要先select,然后insert,最后update -1。最后这个-1操作是不能出现负数的,但是当多用户在有库存的情况下并发操作,出现负数这是无法避免的。

III:最后,当减库存和高并发碰到一起的时候,由于操作的库存数目在同一行,就会出现争抢InnoDB行锁的问题,导致出现互相等待甚至死锁,从而大大降低MySQL的处理性能,最终导致前端页面出现超时异常。

针对上述问题,如何解决呢? 我们先看眼淘宝的高大上解决方案:

I:  关闭死锁检测,提高并发处理性能。

II:修改源代码,将排队提到进入引擎层前,降低引擎层面的并发度。

III:组提交,降低server和引擎的交互次数,降低IO消耗。

以上内容可以参考丁奇在DTCC2013上分享的《秒杀场景下MySQL的低效》一文。在文中所有优化都使用后,TPS在高并发下,从原始的150飙升到8.5w,提升近566倍,非常吓人!!!

不过结合我们的实际,改源码这种高大上的解决方案显然有那么一点不切实际。于是小伙伴们需要讨论出一种适合我们实际情况的解决方案。以下就是我们讨论的解决方案:

首先设定一个前提,为了防止超卖现象,所有减库存操作都需要进行一次减后检查,保证减完不能等于负数。(由于MySQL事务的特性,这种方法只能降低超卖的数量,但是不可能完全避免超卖)

update number set x=x-1 where (x -1 ) >= 0;
登录后复制

解决方案1:

将存库从MySQL前移到Redis中,所有的写操作放到内存中,由于Redis中不存在锁故不会出现互相等待,并且由于Redis的写性能和读性能都远高于MySQL,这就解决了高并发下的性能问题。然后通过队列等异步手段,将变化的数据异步写入到DB中。

优点:解决性能问题

缺点:没有解决超卖问题,同时由于异步写入DB,存在某一时刻DB和Redis中数据不一致的风险。

解决方案2:

引入队列,然后将所有写DB操作在单队列中排队,完全串行处理。当达到库存阀值的时候就不在消费队列,并关闭购买功能。这就解决了超卖问题。

优点:解决超卖问题,略微提升性能。

缺点:性能受限于队列处理机处理性能和DB的写入性能中最短的那个,另外多商品同时抢购的时候需要准备多条队列。

解决方案3:

将写操作前移到MC中,同时利用MC的轻量级的锁机制CAS来实现减库存操作。

优点:读写在内存中,操作性能快,引入轻量级锁之后可以保证同一时刻只有一个写入成功,解决减库存问题。

缺点:没有实测,基于CAS的特性不知道高并发下是否会出现大量更新失败?不过加锁之后肯定对并发性能会有影响。

解决方案4:

将提交操作变成两段式,先申请后确认。然后利用Redis的原子自增操作(相比较MySQL的自增来说没有空洞),同时利用Redis的事务特性来发号,保证拿到小于等于库存阀值的号的人都可以成功提交订单。然后数据异步更新到DB中。

优点:解决超卖问题,库存读写都在内存中,故同时解决性能问题。

缺点:由于异步写入DB,可能存在数据不一致。另可能存在少买,也就是如果拿到号的人不真正下订单,可能库存减为0,但是订单数并没有达到库存阀值。

三、总结


1、前端三板斧【扩容】【限流】【静态化】

2、后端两条路【内存】+【排队】

四、非技术感想


1、团队的力量是无穷的,各种各样的解决方案(先不谈可行性)都是在小伙伴们七嘴八舌中讨论出来的。我们需要让所有人都发出自己的声音,不要着急去否定。

2、优化需要从整体层面去思考,不要只纠结于自己负责的部分,如果只盯着一个点思考,最后很可能就走进死胡同中了。

3、有很多东西以为读过了就懂了,其实不然。依然还是需要实践,否则别人的知识永远不可能变成自己的。

4、多思考为什么,会发生什么,不要想当然。只有这样才能深入进去,而不是留在表面。

ps:以上仅仅是我们讨论的一些方案设想,欢迎大家一起讨论各种可行方案。 

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

淘宝免单红包领取方法2024 淘宝免单红包领取方法2024 May 09, 2024 pm 03:22 PM

2024淘宝免单活动每日三场,大家需要在对应时间下单付款对应金额的商品,免单金额是以等额红包形式发放,接下来给大家带来了淘宝免单红包领取方法2024:抢到免单的用户,红包资格将发放至卡券包,为待激活状态;网页版淘宝暂无卡券包,仅做免单活动的中奖记录的展示;卡券包在【淘宝APP-我的淘宝-我的权益-红包】。淘宝免单红包领取方法20241、抢到免单的用户,红包资格将发放至卡券包,为待激活状态;2、网页版淘宝暂无卡券包,仅做免单活动的中奖记录的展示;3、卡券包在【淘宝APP-我的淘宝-我的权益-红包】

淘宝怎么改名字 淘宝怎么改名字 Mar 24, 2024 pm 03:31 PM

改名功能在淘宝中可以让用户自由改名字昵称,有些用户并不知道淘宝怎么改名字,在我的淘宝中的设置里点击头像的淘宝账号进行修改即可,接下来小编就为大家带来了改名字昵称方法的介绍,还不知道的用户快来下载试试看吧。淘宝使用教程淘宝怎么改名字答:在我的淘宝中的设置里点击头像的淘宝账号进行修改即可详情介绍:1、进入淘宝,点击右下【我的淘宝】。2、点击右上的【设置】图标。3、点击头像。4、再点【淘宝账号】。5、点击【修改账号名】,输入并修改即可。

淘宝怎么关掉红包提醒 淘宝怎么关掉红包提醒 Apr 01, 2024 pm 06:25 PM

淘宝是很多小伙伴们常用的网购软件,平时很多东西各位都会从里面下单购买,里面给用户们提供了红包提醒功能,有的朋友们想要来关掉,那么就赶快来PHP中文网看看吧。淘宝关闭红包提醒步骤一览1、打开淘宝APP的个人中心,选择【设置】按钮进入页面。2、找到【消息通知】选项,在这里可以选择消息推送开关,找到红包消息将开关关闭就可以了。3、或者也可以通过手机的设置页面,将淘宝APP的通知权限关闭,这样所有来自淘宝的消息都不会进入推送,只有打开后才能看到。4、用户可以自己设置想要接收哪些类型的消息,这样使用起来也

淘宝开店注册流程 淘宝开店注册流程 Mar 25, 2024 pm 01:37 PM

1、打开淘宝app,点击右下角的【我的淘宝】,点击右上角【设置】。2、选择【商家入驻】,点击【淘宝开店】,选择【普通商家】。3、在【免费开店】界面,用户可以看到【个人商家】开店的具体流程。4、给自己的小店命名,然后点击【去开店】,三项全部勾选,点击【0元开店】。5、最后完成【实人认证】,完善【店铺基础信息】即可成功开店。

《淘宝》510免单红包怎么用 《淘宝》510免单红包怎么用 May 08, 2024 pm 10:00 PM

淘宝510免单红包怎么用?淘宝近期开展了510周年庆的免单活动,这个活动是可以获取免单红包的,福利非常的多,相信很多小伙伴都想参与这个活动,也有小伙伴已经领取到了免单红包,但是却不知道具体的用法,今天就带大家一起来看看相关的介绍吧。淘宝510周年庆免单红包使用介绍使用方:猜题下单的所有订单确认收货后,免单红包即可使用。一、免单红包发放及追回用户可以通过网页版淘宝暂无卡券包,但可在【淘宝APP-我的淘宝-我的权益-红包】处查看。抢到免单的用户,红包资格将发放至卡券包,为待激活状态;卡券包在进行中奖

《淘宝》免单红包退款会退回吗 《淘宝》免单红包退款会退回吗 May 08, 2024 am 08:16 AM

在淘宝购物时,我们经常会使用免单红包来享受优惠。但是,如果我们需要退款,这些免单红包会被退回吗?让我们来看看这个问题的答案。淘宝免单红包退款会退回吗分情况而论获得红包时,红包是待激活状态,在兑换商品之前,这个待激活的红包是没有激活的,暂时无法使用,等购买的商品确认收货之后,待激活状态的红包才可使用。免单红包使用后商品有问题需要退货,那么红包的退回需要按照实际情况来判断:一、退款规则11、红包使用后发生退款,则红包按比例退回。2、在未逾期的情况下,退回红包的使用期限为原定使用期限,如果逾期7天内发

使用C++实现机器学习算法:常见挑战及解决方案 使用C++实现机器学习算法:常见挑战及解决方案 Jun 03, 2024 pm 01:25 PM

C++中机器学习算法面临的常见挑战包括内存管理、多线程、性能优化和可维护性。解决方案包括使用智能指针、现代线程库、SIMD指令和第三方库,并遵循代码风格指南和使用自动化工具。实践案例展示了如何利用Eigen库实现线性回归算法,有效地管理内存和使用高性能矩阵操作。

淘宝大赢家3月31日:唐朝时人们还可以称父亲为 淘宝大赢家3月31日:唐朝时人们还可以称父亲为 Mar 31, 2024 pm 12:11 PM

淘宝大赢家3月31日问题:唐朝时,人们还可以称父亲为?有很多用户不知道唐朝时,人们还可以称父亲为什么?,那么接下来小编就为大家带来了3.31淘宝大赢家每日一猜今日答案分享,感兴趣的小伙伴快来了解一下吧。淘宝每日一猜答案大全淘宝大赢家3月31日:唐朝时,人们还可以称父亲为?问题:唐朝时,人们还可以称父亲为?答案:B.哥哥答案解析:1、点击进来找线索,在如下图的页面即可找到问题的答案;2、唐代人可以称父亲为哥哥,《旧唐书·王琚传》中“玄宗曰:四哥仁孝”;3、这里的“四哥”,指的是玄宗的父亲睿宗,在同

See all articles