秒杀的设计思路

mypyway mypyway     2023-01-01     734

关键词:

电商:如何设计一个秒杀系统
 
 
什么是秒杀
秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。
秒杀系统场景特点
  • 秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增。
  • 秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功。
  • 秒杀业务流程比较简单,一般就是下订单减库存。
秒杀架构设计理念
限流: 鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。
削峰:对于秒杀系统瞬时会有大量用户涌入,所以在抢购一开始会有很高的瞬间峰值。高峰值流量是压垮系统很重要的原因,所以如何把瞬间的高流量变成一段时间平稳的流量也是设计秒杀系统很重要的思路。实现削峰的常用的方法有利用缓存和消息中间件等技术。
异步处理:秒杀系统是一个高并发系统,采用异步处理模式可以极大地提高系统并发量,其实异步处理就是削峰的一种实现方式。
内存缓存:秒杀系统最大的瓶颈一般都是数据库读写,由于数据库读写属于磁盘IO,性能很低,如果能够把部分数据或业务逻辑转移到内存缓存,效率会有极大地提升。
可拓展:当然如果我们想支持更多用户,更大的并发,最好就将系统设计成弹性可拓展的,如果流量来了,拓展机器就好了。像淘宝、京东等双十一活动时会增加大量机器应对交易高峰。
架构方案
 
 
设计思路
将请求拦截在系统上游,降低下游压力:秒杀系统特点是并发量极大,但实际秒杀成功的请求数量却很少,所以如果不在前端拦截很可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时。 
充分利用缓存:利用缓存可极大提高系统读写速度。 
消息队列:消息队列可以削峰,将拦截大量并发请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动的拉取请求消息进行业务处理。
 
前端方案
浏览器端(js):
页面静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。 
禁止重复提交:用户提交之后按钮置灰,禁止重复提交 
用户限流:在某一时间段内只允许用户提交一次请求,比如可以采取IP限流
后端方案
 
服务端控制器层(网关层)
限制uid(UserID)访问频率:我们上面拦截了浏览器访问的请求,但针对某些恶意攻击或其它插件,在服务端控制层需要针对同一个访问uid,限制访问频率。
服务层
上面只拦截了一部分访问请求,当秒杀的用户量很大时,即使每个用户只有一个请求,到服务层的请求数量还是很大。比如我们有100W用户同时抢100台手机,服务层并发请求压力至少为100W。
  1. 采用消息队列缓存请求:既然服务层知道库存只有100台手机,那完全没有必要把100W个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。
  2. 利用缓存应对读请求:对类似于12306等购票业务,是典型的读多写少业务,大部分请求是查询请求,所以可以利用缓存分担数据库压力。
  3. 利用缓存应对写请求:缓存也是可以应对写请求的,比如我们就可以把数据库中的库存数据转移到Redis缓存中,所有减库存操作都在Redis中进行,然后再通过后台进程把Redis中的用户秒杀请求同步到数据库中。
数据库层
数据库层是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截掉,数据库层只承担“能力范围内”的访问请求。所以,上面通过在服务层引入队列和缓存,让最底层的数据库高枕无忧。
案例:利用消息中间件和缓存实现简单的秒杀系统
Redis是一个分布式缓存系统,支持多种数据结构,我们可以利用Redis轻松实现一个强大的秒杀系统。
我们可以采用Redis 最简单的key-value数据结构,用一个原子类型的变量值(AtomicInteger)作为key,把用户id作为value,库存数量便是原子变量的最大值。对于每个用户的秒杀,我们使用 RPUSH key value插入秒杀请求, 当插入的秒杀请求数达到上限时,停止所有后续插入。
然后我们可以在台启动多个工作线程,使用 LPOP key 读取秒杀成功者的用户id,然后再操作数据库做最终的下订单减库存操作。
当然,上面Redis也可以替换成消息中间件如ActiveMQRabbitMQ等,也可以将缓存和消息中间件 组合起来,缓存系统负责接收记录用户请求,消息中间件负责将缓存中的请求同步到数据库。

关于秒杀的场景特点分析

 关于秒杀的场景特点分析秒杀系统的场景特点-秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增;-秒杀一般是访问请求量远远大于库存数量,只有少部分用户能够秒杀成功;-秒杀业务流程比较简单,一般... 查看详情

关于秒杀的场景特点分析

 关于秒杀的场景特点分析秒杀系统的场景特点-秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增;-秒杀一般是访问请求量远远大于库存数量,只有少部分用户能够秒杀成功;-秒杀业务流程比较简单,一般... 查看详情

亿级流量架构实战之双十一秒杀架构设计(代码片段)

...种处理思路,这儿将这些思路与业务综合起来,情形一就是秒杀,提到秒杀,很多人都会觉得这是一件技术要求很高的事情,因为这涉及到超大访问量(可能瞬间千万倍的用户访问商品)、维护数据一致性(不能超卖),前者对性能有极高的... 查看详情

秒杀思路:yii2加redis实现秒杀

整理一些思路  PHP7,yii2加Redis怎么实现秒杀一个list列表存放秒杀的商品一个list列表存放秒杀的客户信息首先读取秒杀商品到商品列表,然后等待客户秒杀. 每次客户请求,检查用户列表与商品数量是否大于等于.如果是就... 查看详情

java初探之秒杀的安全

在秒杀的场景中还存在着很多的安全问题暴露秒杀地址秒杀请求可以很频繁接口流量大,恶意刷接口 隐藏秒杀接口为什么需要隐藏,事实上,页面上的所有东西都能被客户端拿到,包括js代码,因此,分析商品详情页面就可... 查看详情

如何设计一个能抗高并发的秒杀场景(代码片段)

说明:秒杀场景中有许多需要考虑的问题,这里只是将如何设计一个能抗高并发的秒杀设计的主流程进行分析!!!一、秒杀的特点商品库存总量固定先到先得,瞬时并发极大商品数量和库存数量有限二、... 查看详情

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

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

秒杀的性能和超卖

一、秒杀带来了什么?    秒杀或抢购活动一般会经过【预约】【抢订单】【支付】这3个大环节,而其中【抢订单】这个环节是最考验业务提供方的抗压能力的。  抢订单环节一般会带来2个问题:  1、高并发  ... 查看详情

电商 秒杀系统 设计思路和实现方法(代码片段)

电商 秒杀系统 设计思路和实现方法2017年05月26日00:06:35阅读数:36621秒杀业务分析正常电子商务流程(1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货秒杀业务的特性(1)低廉价格... 查看详情

秒杀系统设计

阿里云redis读写分离典型场景:搭建电商秒杀 用户进程间通信主要哪几种方式?——管道(Pipe)、命名管道(namedpipe)、消息(Message)队列、共享内存…redis热点数据的存储啊,整体性能的提升大家看到问题所在了么?是... 查看详情

电商网站秒杀与抢购的系统架构

...来的挑战在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态。我们现在一起来讨论下,优化的思路和方... 查看详情

实现高并发秒杀的七种方式(代码片段)

点击关注公众号,实用技术文章及时了解引言商品秒杀-超卖解决商品超卖方式一(改进版加锁)方式二(AOP版加锁)方式三(悲观锁一)方式四(悲观锁二)方式五(乐观锁)方式六... 查看详情

实现高并发秒杀的七种方式(代码片段)

点击关注公众号,实用技术文章及时了解引言商品秒杀-超卖解决商品超卖方式一(改进版加锁)方式二(AOP版加锁)方式三(悲观锁一)方式四(悲观锁二)方式五(乐观锁)方式六... 查看详情

秒杀活动java怎么实现

秒杀与其他业务最大的区别在于:秒杀的瞬间:(1)系统的并发量会非常的大(2)并发量大的同时,网络的流量也会瞬间变大。一个秒杀或者抢购页面,通常分为2个部分,一个是静态的HTML等内容,另一个就是参与秒杀的Web后... 查看详情

解决redis秒杀超卖的问题

我们再使用redis做秒杀程序的时候,解决超卖问题,是重中之重。以下是一个思路。  用上述思路去做的话,我们再用户点击秒杀的时候,只需要检测,kucun_count中是否能pop出数据,如果能pop出来则证明还有库存,且秒杀成功... 查看详情

秒杀系统设计优化(代码片段)

...相同的库存,读写冲突,锁非常严重;小米手机每周二的秒杀,可能手机只有1万部,但瞬时进入的流量可能是几百几千万;这是秒杀业务难的地方。那我们怎么优化秒杀系统呢?一、难点(1)高并发用户在秒杀开始前,通过不... 查看详情

实现高并发秒杀的7种方式(代码片段)

...作中很常见,特别是在互联网公司中,这篇文章就来通过秒杀商品来模拟高并发的场景。文章末尾会附上文章的所有代码、脚本和测试用例。本文环境: SpringBoot2.5.7+MySQL8.0X+MybatisPlus+Swagger2.9.2模拟工具: Jmeter模拟场景:&... 查看详情

十万级低成本超详细的秒杀高并发设计,快收藏起来(代码片段)

秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀,那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题?如何设计出健壮的秒杀系统... 查看详情