秒杀/抢购系统设计优化

互联网技术老兵 互联网技术老兵     2022-09-07     788

关键词:

12306抢票,票是有限的,库存一份,瞬时流量非常多,都读相同的库存,读写冲突,锁非常严重;
小米手机每周二的秒杀,可能手机只有1万部,但瞬时进入的流量可能是几百几千万;
这是秒杀业务难的地方。那我们怎么优化秒杀系统呢?

一、难点

(1)高并发
用户在秒杀开始前,通过不停刷新浏览器页面以保证不会错过秒杀,这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器和数据库服务器造成负载压力。
(2)超卖
由于库存并发更新的问题,导致在实际库存已经不足的情况下,库存依然在减,导致卖家的商品卖得件数超过秒杀的预期。

二、架构

常见的站点架构基本是这样的:
(1)浏览器端,最上层,会执行到一些JS代码
(2)站点层,这一层会访问后端数据,拼HTML页面返回给浏览器
(3)服务层,向上游屏蔽底层数据细节,提供数据访问
(4)数据层,最终的库存是存在这里的

三、思路

(1)将请求尽量拦截在上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据库读写锁冲突严重,导致响应慢,下单基本不能成功
(2)利用缓存:这是一个典型的读多写少的应用场景,非常适合使用缓存

四、解决方案

(1)浏览器层请求拦截
1.产品层面,用户点击“查询”或“购票”后,按钮置灰,禁止用户重复提交请求
2.js层面,限制用户在n秒之内只能提交一次请求
(2)站点层请求拦截与页面缓存
1.静态化,将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素
2.限频率,同一个UID,限制访问频率,做页面缓存,n秒内到达站点层的请求,均返回同一页面
(3)服务层请求拦截与数据缓存
1.对于写请求,将所有写请求在缓存(Redis或Memcached)中,做请求单队列排队,每次只透过有限的写请求异步写入到数据层,如果均成功再放下一批,如果库存不够则队列里的写请求全部返回“已售完”
2.对于读请求,用Redis或Memcached
缓存写性能和读性能都远高于MySQL,只有非常少的写和读缓存的请求会透到数据层去
(4)数据层
1.尝试扣减库存,扣减库存成功才会进行下单逻辑(由于MySQL事务的特性,不可能完全避免超卖)

UPDATE table_name SET n=n-1 WHERE n>1;

2.扣减库存后进行检查,保证减完不能等于负数
查看更多:
开发一个微信小程序实例教程
HTTP协议整理
PHP安全之Web攻击
MySQL优化
Linux下常见的IO模型
参考资料:
https://my.oschina.net/xianggao/blog/524943
http://www.infoq.com/cn/articles/flash-deal-architecture-optimization

秒杀抢购系统优化思路详解

前几年,火车票购票网站12306,每到放假高峰期,在线票刷不出来,购买困难,甚至出现了各种插件支持抢票,这样的场景,对于每个买过票的人,应该印象深刻。小米手机的抢购活动,同样异常火爆,在几分钟的时间内,卖出... 查看详情

网站抢购秒杀系统设计简析

秒杀是电子商务网站常见的一种营销手段。原则不要整个系统宕机。即使系统故障,也不要将错误数据展示出来。尽量保持公平公正。实现效果秒杀开始前,抢购按钮为活动未开始。秒杀开始时,抢购按钮可以点击下单。秒杀结... 查看详情

电商的秒杀和抢购

...自:【问底】徐汉彬:Web系统大规模并发——电商秒杀与抢购电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万... 查看详情

web系统大规模并发——电商秒杀与抢购

电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。这次我们会关注秒... 查看详情

web系统大规模并发——电商秒杀与抢购

电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。这次我们会关注秒... 查看详情

如何设计一个秒杀系统

什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来... 查看详情

秒杀系统的设计与实现(限时抢购抢救接口单用户限制实现)(代码片段)

...设计的系统还有一些问题:我们应该在一定的时间内执行秒杀处理,不能再任意时间都接受秒杀请求。如何加入时间验证?对于稍微懂点电脑的,又会动歪脑筋的人来说开始通过抓包方式获取我们的接口地址。然后通过脚本进行... 查看详情

秒杀的设计思路

电商:如何设计一个秒杀系统  什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这... 查看详情

如何设计一个秒杀系统(代码片段)

什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大... 查看详情

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

一、问题的提出秒杀或抢购活动一般会经过预约,下单,支付,扛不住的地方在于下单,一般会带来2个问题:1、高并发比较火热的秒杀在线人数都是10w起的,如此之高的在线人数对于网站架构从前到后都是一种考验。2、超卖任... 查看详情

电商网站秒杀和抢购的高并发技术实现和优化

一、如何防止多个用户同时抢购同一商品,防止高并发同时订购同一商品?​最近双十一抢购系统应用频繁,销量火爆的同时,让人头疼是却是多用户高并发情况下出现的库存问题。据调查,多个用户同时下单,导致查询和插入... 查看详情

秒杀/抢购架构设计(代码片段)

1秒杀业务分析1.1正常电子商务流程(1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货1.2秒杀业务的特性( 查看详情

秒杀微服务实现抢购代金券功能(代码片段)

文章目录需求分析秒杀场景的解决方案数据库表设计代金券表抢购活动表订单表创建秒杀服务pom依赖配置文件关系型数据库实现代金券秒杀相关实体引入抢购代金券活动信息代金券订单信息Rest配置类全局异常处理添加代金券秒... 查看详情

2017-5-26/描述一个高性能高可靠的网站架构——如何设计一个秒杀系统

一、秒杀的应用场景电商网站的抢购活动、12306网站的抢票、抢红包。 二、秒杀的特点1、秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增。2、数据库的并发读写冲突以及资源的锁请求冲突非常严重。3、... 查看详情

互联网秒杀设计

分享内容抢先看本次分享介绍了A对抢购业务的设计实践。主要包括例如以下主题: 1.抢购业务介绍 2.详细抢购项目中的设计 2.1.怎样解耦前后端压力 2.2.怎样保证商品库存可靠 2.3.怎样在业务中多放对账 3.... 查看详情

优惠卷秒杀系统设计秒杀优化——基于阻塞队实现异步秒杀优化及基于lua脚本判断秒杀库存一人一单(代码片段)

(目录)秒杀优化1、秒杀优化-异步秒杀思路回顾一下下单流程:分成如下几个步骤:在这六步操作中,又有很多操作是要去操作数据库的,而且还是一个线程串行执行,这样就会导致我们的程序执行的很慢,所以我们需要异步程... 查看详情

redis轻松实现秒杀系统(代码片段)

点击关注公众号,实用技术文章及时了解什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售... 查看详情

redis轻松实现秒杀系统(代码片段)

点击关注公众号,实用技术文章及时了解什么是秒杀秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售... 查看详情