超卖

关于秒杀的系统架构优化思路

谁说胖子不能爱 提交于 2019-11-28 11:29:46
解决方案1: 将存库从MySQL前移到Redis中,所有的写操作放到内存中,由于Redis中不存在锁故不会出现互相等待,并且由于Redis的写性能和读性能都远高于MySQL,这就解决了高并发下的性能问题。然后通过队列等异步手段,将变化的数据异步写入到DB中。 优点:解决性能问题 缺点:没有解决超卖问题,同时由于异步写入DB,存在某一时刻DB和Redis中数据不一致的风险。 解决方案2: 引入队列,然后将所有写DB操作在单队列中排队,完全串行处理。当达到库存阀值的时候就不在消费队列,并关闭购买功能。这就解决了超卖问题。 优点:解决超卖问题,略微提升性能。 缺点:性能受限于队列处理机处理性能和DB的写入性能中最短的那个,另外多商品同时抢购的时候需要准备多条队列。 解决方案3: 将写操作前移到MC中,同时利用MC的轻量级的锁机制CAS来实现减库存操作。 优点:读写在内存中,操作性能快,引入轻量级锁之后可以保证同一时刻只有一个写入成功,解决减库存问题。 缺点:没有实测,基于CAS的特性不知道高并发下是否会出现大量更新失败?不过加锁之后肯定对并发性能会有影响。 解决方案4: 将提交操作变成两段式,先申请后确认。然后利用Redis的原子自增操作(相比较MySQL的自增来说没有空洞),同时利用Redis的事务特性来发号,保证拿到小于等于库存阀值的号的人都可以成功提交订单。然后数据异步更新到DB中

并发时库存超卖时问题解决方案

北城以北 提交于 2019-11-27 14:20:32
并发时库存超卖时问题解决 方案一 数据库设置字段为无符号型 当并发超卖时直接报异常 通过捕获异常提示已经售空。 方案二 采用排他锁 当用户同时到达更新操作,同时到达的用户一个个执行 在当前这个update语句commit之前,其他用户等待执行 方案三 采用Redis的队列实现,用于抢购 先从MySQL读取库存数,放到Redis的队列中 用户直接操作队列,当队列为空时提醒售空 当抢购结束后可执行更新库存表操作 方案四 采用乐观锁原理 在数据表中加入版本号字段 当读取数据时,将version字段的值一同读出,数据每更新一次,对当前version值加一,当并发数据进行出库操作时新version版本号不同而停止 这样虽然不能避免脏读,但是能避免脏读后对数据产生的影响,对比悲观锁需要一直锁数据来说性能提升很大。 关于MVCC(Multiversion Concurrency Control多版本并发控制) innoDB的行级锁采用了乐观锁原理,在每个字段后面隐藏了两个字段,分别是创建版本号与删除版本号,当创建时记录创建时间,当记录删除或者更新时记录删除时间,因为创建时间和删除时间都是根据索引来的,所以innodb锁索引。 来源: CSDN 作者: 陈豆粒 链接: https://blog.csdn.net/qq_28643817/article/details/88792135

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

给你一囗甜甜゛ 提交于 2019-11-26 19:41:32
最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。   ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都懂了,等到自己出解决方案的时候发现还是有很多想不到的地方其实都没懂,再次验证了“细节是魔鬼”的理论。并且一个人的能力有限,只有大家一起讨论才能想的更周全,更细致。好了,闲话少说,下面进入正文。 一、秒杀带来了什么?    秒杀或抢购活动一般会经过【预约】【抢订单】【支付】这3个大环节,而其中【抢订单】这个环节是最考验业务提供方的抗压能力的。   抢订单环节一般会带来2个问题:   1、高并发   比较火热的秒杀在线人数都是10w起的,如此之高的在线人数对于网站架构从前到后都是一种考验。   2、超卖   任何商品都会有数量上限, 如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的难题。 二、如何解决?   首先,产品解决方案我们就不予讨论了。我们只讨论技术解决方案 1、前端    面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】   A:扩容   加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。   B:静态化   将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。   C:限流  

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

岁酱吖の 提交于 2019-11-26 19:41:19
如何解决秒杀的性能问题和超卖的讨论 最近业务试水电商,接了一个秒杀的活。之前经常看到淘宝的同行们讨论秒杀,讨论电商,这次终于轮到我们自己理论结合实际一次了。 ps:进入正文前先说一点个人感受,之前看淘宝的ppt感觉都懂了,等到自己出解决方案的时候发现还是有很多想不到的地方其实都没懂,再次验证了“细节是魔鬼”的理论。并且一个人的能力有限,只有大家一起讨论才能想的更周全,更细致。好了,闲话少说,下面进入正文。 一、秒杀带来了什么? 秒杀或抢购活动一般会经过【预约】【抢订单】【支付】这3个大环节,而其中【抢订单】这个环节是最考验业务提供方的抗压能力的。 抢订单环节一般会带来2个问题:   1、高并发   比较火热的秒杀在线人数都是10w起的,如此之高的在线人数对于网站架构从前到后都是一种考验。   2、超卖   任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的难题。 二、如何解决? 首先,产品解决方案我们就不予讨论了。我们只讨论技术解决方案 1、前端 面对高并发的抢购活动,前端常用的三板斧是【扩容】【静态化】【限流】   A:扩容   加机器,这是最简单的方法,通过增加前端池的整体承载量来抗峰值。   B:静态化   将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。   C:限流