设计一个秒杀系统架构

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 对于秒杀架构的设计,需要遵循以下个原则:东西不能超卖、下单成功的订单数据不能丢失、服务器和数据库不能挂尽量不让机器人抢走整体的思路秒杀架构的设计方案就是一个不断过滤请求的过程,从系统架构层面来说,秒杀系统的分层思路如下。

对于秒杀架构的设计,需要遵循以下个原则:
东西不能超卖、
下单成功的订单数据不能丢失、
服务器和数据库不能挂
尽量不让机器人抢走

整体的思路
秒杀架构的设计方案就是一个不断过滤请求的过程,从系统架构层面来说,秒杀系统的分层思路如下。
image.png

秒杀系统的架构设计目标就是尽可能把上层的用户请求处理掉。
下面我们通过业务的流程来设计秒杀的架构
一、浏览页面
对于PC网站,首先必选前后端分离,然后静态资源放到CDN上。例如我们平时访问的请求是
https://static.xxx.jpg。我们可以将这个staticxxx这个域名解析交给CDN服务商,因CDN服务商在全国各地都有服务器,服务器中存放着我们想要的静态资源的缓存。CDN收到这个域名后,首先会寻找一台响应最快的服务器,并指向这个服务器的IP。使用CDN好处是不浪费自己的服务器资源和带宽,且响应速度快。这样就可以把静态资源的压力拦截在系统分层的外面。

二、下单页面
1、进入下单页面
为了防止别人通过爬虫抓取页面信息,给服务器增加压力,防止恶意请求重复提交,可以做已下两层防护。
第一,页面URL后台动态获取:按照正常的活动设计流程,用户只有在秒杀活动开启后才可进入下单页,但难免有人在开启前就直接获取下单页的URL并不断刷新,这样就给后台服务器增加了压力,这个时候,我们要把下单页面URL做处理(不把它放到静态页面里,而是通过后台动态获取)。用JS判断秒杀开始时间,秒杀时间一到,就可以通过另一个请求获取URL。
第二,用户点击下单页的购买按钮后,按钮就置位disable,防止用户不断点击购买按钮。

2、订单提交
对于订单提交,我们做以下两方面设计:
第一,网关层面过滤请求,可以有以下三种方式,
(1)限定每个用户访问频率,比如每5秒下单1次。
(2)限定每个IP访问频率。
(3)把一个时间段内的请求拦截掉一个百分比,或者只允许特定数量的请求进入后台服务器(可以使用限流的漏桶或者令牌桶算法)

第二,后台服务器过滤请求,到了后台的请求,就不能是过滤请求了,而是保证秒杀商品不被超卖,以及特价商品订单数据准确。
具体实现,可以通过以下三种方式,
(1)商品库存放入缓存Redis中,如果每个请求都查询数据库库存,那数据库必然扛不住,所以我们要把库存放到缓存中,这样每次用户下单前,如果Redis的库存扣减后<0,说明秒杀失败,如果Redis库存扣减后>=0,说明秒杀成功,开始创建订单。
(2)对于生成的订单,可以写入缓存中,对于订单数据我们可以先放到缓存中,然后每隔一段时间批量插入数据库。在用户下单后,会进入一个等待页面,然后这个页面向后台定时轮询订单数据。轮询订单数据的过程中,后台先在 Redis 中查询订单数据,查不到说明已经落库,再去数据库查询订单数据,查到后直接返回给用户,用户收到消息通知后可以直接进入付款页面支付了。在数据库查询订单数据时,查不到说明秒杀失败。
(3)订单批量落库,定期将订单批量落库,且在订单落库的时扣减数据库中的库存。

三、付款页面
在付款页面,基本不需要再过滤用户请求了。在这个环节,除了保障数据的一致性,还需要注意一个要点:如果业务逻辑上出现一个订单未及时付款而被取消,记得把数据库及 Redis 的库存加回去。

为了保证秒杀系统的高可用,需要对静态资源服务器、网关、后台服务器都进行配置负载均衡,而缓存 Redis 和数据库均需要配置集群模式。

对于网关的限流 和如何应对某台服务器宕机,避免其他服务雪崩 (熔断)

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
7月前
|
消息中间件 NoSQL Redis
秒杀的设计思路与实践
秒杀的设计思路与实践
64 1
|
2月前
|
缓存 NoSQL 应用服务中间件
【开发系列】秒杀系统的设计
【开发系列】秒杀系统的设计
|
缓存 NoSQL 数据库
【高并发】秒杀系统设计思路
【高并发】秒杀系统设计思路
216 0
|
消息中间件 缓存 JavaScript
如何设计一个秒杀系统
如何设计一个秒杀系统
|
消息中间件 负载均衡 应用服务中间件
秒杀场景的设计思路和方案
秒杀场景的设计思路和方案
361 0
|
消息中间件 缓存 负载均衡
秒杀系统设计:高并发下的架构考虑
随着互联网的快速发展,电商平台上的秒杀活动越来越受欢迎。然而,高并发的情况下,如何保证秒杀系统的稳定性和可扩展性成为一个非常具有挑战性的问题。在本文中,我们将讨论如何设计一个高效、可靠的秒杀系统。
230 1
|
缓存 NoSQL 安全
秒杀系统的设计思路
你好看官,里面请!今天笔者讲的是秒杀系统的设计思路。不懂或者觉得我写的有问题可以在评论区留言,我看到会及时回复。 注意:本文仅用于学习参考,不可用于商业用途,如需转载请跟我联系。
434 2
|
数据采集 缓存 前端开发
如何设计一个秒杀系统(上)
秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题。
546 0
如何设计一个秒杀系统(上)
|
消息中间件 缓存 运维
如何设计一个秒杀系统(下)
这里我们讲解最后一部分
322 0
如何设计一个秒杀系统(下)
|
存储 缓存 负载均衡
秒杀架构分析与实践
秒杀系统相信很多人见过,比如京东或淘宝的秒杀,那么秒杀系统是如何实现的呢?如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题呢?
548 4
下一篇
DataWorks