您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

秒杀系统怎么设计?

时间:2019-08-08 10:37:22  来源:  作者:

什么是秒杀?

“秒杀”是商家在特定时间点进行促销的一种运营手段,体现在系统层面,是指一个Web系统,在一秒钟收到数以万计的用户请求,来抢购数量有限的促销产品。本质上,秒杀系统就是一个“三高”系统,即高并发、高性能、高可用的分布式系统。本文主要从“高并发”的角度,来看看需要解决的主要问题。

秒杀需要处理并发读,并发写。“并发读”需要通过各种手段减少用户到服务端来读数据,而“并发写”主要需要保证数据的正确性,确保大流量下数据一致。

秒杀系统关注三方面

下面以一个秒杀系统的例子,来看看一个秒杀系统主要关注的三方面问题。

秒杀系统怎么设计?

 

一、高并发访问

秒杀前用户不断刷新页面查看,来获得购买按钮,抢购时集中点击并发购买,核心是对系统数据的高并发读访问,可以通过如下手段进行防护。

访问拦截:从浏览器/反向代理/Web层/服务层/数据层多层拦截流量,尽量把访问拦截在离用户更近的层,减少对后台的压力;

分流:主要通过分布式集群技术,多台机器处理,提高并发能力;

动静分离:将动态数据和静态数据尽量分离,并通过缓存和CDN等技术对数据读取进行加速;

二、数据正确性

秒杀伴随这一系列业务流程,包括浏览商品、进入抢购页、购买、扣减库存、支付。其中并发写主要与扣减库存有关,要保证数据的正确性,防止超卖发生。大概的解决方法有:

减库存:事务判断,热点商品放到单独的热点库,增加并发锁

热点:对核心热点数据进行实时分析,并在系统中进行优化或隔离

异步化:是指把购买请求的接受和处理异步化。购买请求先放到队列中,这个过程非常高效,返回客户信息。

限流降级:请求限流,控制系统的访问;对服务的下游依赖进行降级,保证核心链路

三、防作弊

抢购还需要保证公平性,方舟如购票插件购买火车票、黄牛党等。在技术角度,大概方法有:

答题:为了增加购买的复杂度;延缓请求。

Cache校验:处理用户购买请求时校验缓存中是否已记录此商品的购买。

秒杀系统设计原则

1、前台请求数尽量少

前台请求会增加浏览器的负担,尽量简化或合并页面大小(css/JS,图片等),去掉页面装饰;减少DNCS解析

2、后台数据尽量少

后台数据会增加网络传输,压缩和字符编码,消耗CPU。需要梳理后台依赖的数据和服务,关注序列化/反序列化方式,减少不必要的数据交互

3、调用路径要尽量短

分布式调用错综复杂,需要尽量缩短调用链路;减少第三方依赖,尽量弱依赖,并做好应用分级

4、尽量不要有单点

高可用和稳定性角度,消除单点;服务无状态化,解藕服务状态和机器,如机器配置动态化;有状态的存储,通过冗余备份提高可用性。

高并发之“访问拦截”

高并发的访问拦截主要思路是:

从浏览器/反向代理/Web层/服务层/数据层多层拦截流量,尽量把访问拦截在离用户更近的层,尽可能地过滤掉无效请求,让“漏斗”最末端的才是有效请求。同时,用户请求更早的得到处理,也减少了每次请求的RT,进而提高了系统的QPS和并发程度。

秒杀系统怎么设计?

 

浏览器访问拦截

防止用户的不必要的点击,可以在产品层面限制用户的行为,比如点击后按钮不可用,限定时间接受请求。当然,为了防止恶意抢购,还需要在防作弊上做其他尝试,比如前文讲的答题/cache校验等。

CDN加速

CDN的全称是Content Delivery Network,即内容分发网络。简单来讲,就是把原服务器上数据复制到其他服务器上,用户就近访问服务器获取资源。缺点是内容变更生效慢。

反向代理访问拦截

主要是动静分离,静态文件作为web项目的一部分进行发布;另外通过Nginx托管静态文件 ,减轻Web服务的压力。

Web层和Service层访问拦截

主要是动态数据访问,可以采用缓存的策略,减少对下一层的数据访问。缓存又可分为本地缓存和redis、memcache等缓存中间件。

高并发之“分流”

分流主要通过分布式集群技术,多台机器处理,提高并发能力。

秒杀系统怎么设计?

 

DNS轮询:从App/Browser入口,对请求进行分类,静态数据直接去CDN获取,同时Nginx进行集群化,通过DNCS轮询。

Nginx负载均衡:Nginx可以支持10W的并发访问, Nginx支持配置请求的代理策略,把请求路由到多个Web服务器处理。Nginx支持的负载均衡策略包括:轮询,权重,ip_hash,fair,url_hash等

分布式架构负载策略:Web层调用service,以及service之间的调用,每个service都需要部署多份。目前最常用的两个框架技术,spring cloud、dubbo、HSF,都采用客户端负载均衡策略,路由到service的不同实例。

Redis集群:redis单台几十万的QPS,可通过Redis集群,把数据分配到多台服务器上,减轻每台机器的负载。

MySQL读写分离:一般不对写请求分流,也可通过分布式数据库技术对写请求分流。对于读请求,一般采用读写分离的策略。读库应用单独设置索引,提高读性能。

高并发之“动静分离”

动态页面:根据实时数据渲染的页面,需要调用后台,读取速度慢

静态页面:存储在文件系统的文件,不经常变动,读取速度很

为了提升效率,尽可能静态化,用静态页面,替换动态页面。例如,商品信息页,商品信息在发布后,保存下商品信息的静态页面;仅访问必要的数据实时数据。

几个关注点:

1、 静态数据缓存到离用户最近的地方。比如浏览器、CDN、服务端的 Cache

2、 可以直接缓存 HTTP 连接。关键是数据中是否含有和访问者相关的个性化数据,比如输出的数据是否和 URL、浏览者、时间、地域相关,以及是否含有 Cookie 等私密数据。

3、 经常使用Nginx和Web服务器缓存静态文件。JAVA 系统本身不擅长处理大量连接请求,需要在Nginx和Web侧尽量缓存

4、 动态数据尽量Json化。减少不必要的数据传输和解析

5、 缓存还需要考虑失效问题/命中率问题/发布更新问题/动静数据合并;以失效为例,一般有三种方式:超时更新,定时更新,通知更新。

秒杀之“减库存”

减库存一般有如下方式:下单减库存,付款减库存,预扣库存。

其中,笔者比较推荐“下单减库存”,因为参加秒杀,买到就是赚到,成功下单后却不付款的情况比较少;同时卖家对秒杀商品的库存有严格限制,逻辑上更为简单。

当然“下单减库存”,要保证库存数据不能为负数。

一些方法:

1、事务判断,即保证减后库存不能为负数,否则就回滚;

2、直接设置数据库的字段数据为无符号整数,小于零时会直接报错;

3、热点商品放在单独的热点库

4、并发锁:增加并发锁,比如排队等

5、计数器:在Web层或Service层做一个计数器,技术到达阈值,直接返回抢购失败。

6、按商品路由:把对同一品类商品的抢购路由到同一个service以及DB链接上,减少不必要的锁竞争。

实践中的一些原则:

1. 将读数据缓存在 Web 端,过滤掉无效的数据读;

2. 对读数据不做强一致性校验;

3. 对写数据做基于时间的分片,过滤过期请求;

4. 对写请求做限流保护,过滤超载请求;

5. 对写数据强一致性校验,仅校验最后有效的数据。

秒杀之“热点”

秒杀需要对核心热点数据进行实时分析,处理思路可以从业务/系统/数据不同角度进行优化/限制/隔离,比如:

静态热点数据:提前预测。卖家报名,提前打标

动态热点数据:系统在运行过程中临时产生的热点

也可以增加单独的热点分析组件,总体控制系统业务的热点,并做对应的限制和隔离方法。

秒杀之“异步”

秒杀系统设计上,经常使用消息队列来缓冲瞬时流量,把同步的请求调用转换成异步的间接推送,中间通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地消费消息。

秒杀系统怎么设计?

 

本质上,就是把一步变成两步,其中增加一些机制来缓冲。比如在秒杀优惠券抢购,用户抢码(确定用户是否有资格) 和 系统发码(为有资格用户分发优惠券) ,抢码QPS可能10几万,只需要知道是否有资格;而发码仅针对有资格用户,QPS可能仅仅几千,使用消息队列,可以大大提高效率。

除了消息队列,也可以使用其他方式排队,比如线程池加锁等待、内存排队算法(如FIFO)、文件排队(如基于 MySQL binlog 的同步机制)

Takeaways

  • 秒杀系统就是一个“三高”系统,即高并发、高性能高可用的分布式系统
  • 秒杀设计原则:前台请求尽量少,后台数据尽量少,调用链路尽量短,尽量不要有单点
  • 秒杀高并发方法:访问拦截、分流、动静分离
  • 秒杀数据方法:减库存策略、热点、异步、限流降级
  • 访问拦截主要思路:通过CDN和缓存技术,尽量把访问拦截在离用户更近的层,尽可能地过滤掉无效请求。
  • 分流主要思路:通过分布式集群技术,多台机器处理,提高并发能力。

最后

秒杀要求对系统的高并发、高性能和高可用都有极高的要求,本文主要从高并发的角度进行了阐述。对于高性能和高可用,感兴趣的同学可以关注小编



Tags:秒杀系统   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
导论曾经被问过好多次怎样实现秒杀系统的问题。昨天又在CSDN架构师微信群被问到了。因此这里把我设想的实现秒杀系统的价格设计分享出来。供大家参考。秒杀系统的架构设计秒...【详细内容】
2021-03-03  Tags: 秒杀系统  点击:(175)  评论:(0)  加入收藏
秒杀业务分析正常电子商务流程: 查询商品 创建订单 扣减库存 更新订单 付款 卖家发货秒杀业务的特性 低廉价格 大幅推广 瞬时售空 一般是定时上架 时间短、瞬时并发量高秒杀...【详细内容】
2020-07-04  Tags: 秒杀系统  点击:(125)  评论:(0)  加入收藏
究竟什么样的系统算是高并发系统?今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构,结合高并发专题下的其他文章,学以致用。...【详细内容】
2020-04-20  Tags: 秒杀系统  点击:(54)  评论:(0)  加入收藏
前言Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次Offer...【详细内容】
2020-03-11  Tags: 秒杀系统  点击:(168)  评论:(0)  加入收藏
简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质上是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大流量...【详细内容】
2019-11-25  Tags: 秒杀系统  点击:(71)  评论:(0)  加入收藏
前言秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过...【详细内容】
2019-11-19  Tags: 秒杀系统  点击:(65)  评论:(0)  加入收藏
【51CTO.com原创稿件】说到“秒杀”,恐怕大多数人想到的就是“双 11”,“促销”,“买买买”等火爆的场面吧。 图片来自 Pexels大家为了打折商品蜂拥而至,造成电商网站一片繁华...【详细内容】
2019-09-24  Tags: 秒杀系统  点击:(148)  评论:(0)  加入收藏
#0 系列目录# 秒杀系统架构 秒杀系统架构分析与实战#1 秒杀业务分析# 正常电子商务流程(1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货 秒杀业务的特性(1)低廉价格;(2)大幅...【详细内容】
2019-08-21  Tags: 秒杀系统  点击:(209)  评论:(0)  加入收藏
什么是秒杀?“秒杀”是商家在特定时间点进行促销的一种运营手段,体现在系统层面,是指一个Web系统,在一秒钟收到数以万计的用户请求,来抢购数量有限的促销产品。本质上,秒杀系统就...【详细内容】
2019-08-08  Tags: 秒杀系统  点击:(220)  评论:(0)  加入收藏
内容:“商品秒杀”功能模块是建立在“商品详情”功能模块的基础之上,对于这一功能模块而言,其主要的核心流程在于:前端发起抢购请求,该请求将携带着一些请求数据:待秒杀Id跟当前用...【详细内容】
2019-07-23  Tags: 秒杀系统  点击:(350)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(5)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(9)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(21)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(17)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(17)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条