高并发的秒杀系统设计原则

中秋过节了,一堆老程序员聚在了一起,除了撩妹就是讨论技术问题了。于是乎闲扯了一些程序人生和技术问题。我这里整理一些关于秒杀系统的设计原则,希望能够帮助大家对秒杀系统有一个初步的了解和秒杀系统必须要关注的一些问题。当然有些理解不到位的地方还也希望大神们能够指点指点。

秒杀系统要解决的问题

  • 对现有网站业务的冲击
    因为秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必然会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。
  • 高并发情况以及数据库的负载
    用户在秒杀开始前,通过不停的刷新浏览器页面以保证不会错过秒杀,这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器、数据库服务器造成极大的负载压力。
  • 突然增加的网络和服务器带宽
    假设商品页面大小200K(主要是商品图片大小),那么需要的网络和服务器带宽是2G(200K×10,000),这些网络带宽是因为秒杀活动新增的,超过网站平时使用的带宽。
  • 直接下单
    秒杀的游戏规则是到了秒杀时间才能开始对商品下单购买,在此时间点之前,只能浏览商品信息,不能下单。而下单页面也是一个普通的URL,如果得到这个URL,不用等到秒杀开始就可以下单了。
  • 防止恶意秒杀
    防止网上的一些“秒杀器”,一些恶意攻击者等

老司机们谈到的设计方案

  • 秒杀系统独立部署
    为了避免因为秒杀活动的高并发访问而拖垮整个网站,使整个网站不必面对蜂拥而来的用户访问,将秒杀系统独立部署,如果需要,还可以使用独立的域名,以和网站完全隔离,即使秒杀系统崩溃了,也不会对网站造成任何影响。
  • 秒杀商品页面静态化
    秒杀商品页面重新设计,不使用网站原来的商品详情页面,页面内容静态化:商品描述,商品参数,成交记录,用户评价全部写入一个静态页面,用户请求不需要经过应用服务器的业务逻辑处理,也不需要访问数据库。所以秒杀商品服务不需要部署动态的Web服务器、数据库服务器。
  • 租借秒杀活动网络带宽
    对于因为秒杀新增的网络带宽,必须和运营商重新购买或者租借。为了减轻网站服务器的压力,需要将秒杀商品页面缓存在CDN,同样需要和CDN服务商临时租借新增的出口带宽。
  • 动态生成随机下单页面URL
    为了避免用户直接访问下单页面URL,需要将该URL动态化,即使秒杀系统的开发者也无法在秒杀开始前访问下单页面的URL。办法是在下单页面URL加入由服务器端生成的随机数作为参数,在秒杀开始的时候才能得到。
  • 防止“秒杀器”和一些网络攻击
    做到真正的安全很难,我们要做的就是尽量保证安全。最基本的要防止一些代理和限制某些ip,增加一些验证码等措施。

秒杀系统的热点隔离原则

为什么需要隔离,就是秒杀系统不能影响其他系统和业务的正常工作。秒杀系统设计的第一个原则就是将这种热点数据隔离出来,不要让1%的请求影响到另外的99%,隔离出来后也更方便对这1%的请求做针对性优化。针对秒杀我们需要做到多个层次的隔离:

  1. 业务隔离。把秒杀做成一种营销活动,卖家要参加秒杀这种营销活动需要单独报名,从技术上来说,卖家报名后对我们来说就是已知热点,当真正开始时我们可以提前做好预热。
  2. 系统隔离。系统隔离更多是运行时的隔离,可以通过分组部署的方式和另外99%分开。秒杀还申请了单独的域名,目的也是让请求落到不同的集群中。
  3. 数据隔离。秒杀所调用的数据大部分都是热数据,比如会启用单独cache集群或MySQL数据库来放热点数据,目前也是不想0.01%的数据影响另外99.99%。

当然实现隔离很有多办法,如可以按照用户来区分,给不同用户分配不同cookie,在接入层路由到不同服务接口中;还有在接入层可以对URL的不同Path来设置限流策略等。服务层通过调用不同的服务接口;数据层可以给数据打上特殊的标来区分。目的都是把已经识别出来的热点和普通请求区分开来。

秒杀系统的动静分离原则

为了提高系统的响应能力光做以上的隔离还不够,我们还需要做到页面静态化,这也是解决大流量系统的一个重要原则。动静分离原则我们可以进行如下图所示的架构:

秒杀系统的动静分离

具体的要求,要做到如下3点:

  • 把整个页面Cache在用户浏览器
  • 如果强制刷新整个页面,也会请求到CDN
  • 实际有效请求只是“刷新抢宝”按钮

秒杀系统的数据分层校验原则

在秒杀系统中,所有的流量最终操作DB或做写操作的基本上都只剩很少的一小部分了。秒杀系统的分层校验设计如下图所示:

秒杀系统的分层校验

具体的分层校验原则如下:

  • 先做数据的动静分离
  • 将90%的数据缓存在客户端浏览器
  • 将动态请求的读数据Cache在Web端
  • 对读数据不做强一致性校验
  • 对写数据进行基于时间的合理分片
  • 对写请求做限流保护
  • 对写数据进行强一致性校验

秒杀系统做到以上设计原则可能还不够,我们还需要设计应用层排队原则,数据库层排队原则,缓存命中原则,分布式事务处理等。以上设计原则只代表个人观点,希望各路大神进行指点指点。

版权声明:本文为博主原创文章,未经博主允许不得转载。

高并发的秒杀系统设计原则

: » 高并发的秒杀系统设计原则

原创文章,作者:jamestackk,如若转载,请注明出处:https://blog.ytso.com/tech/java/251474.html

(0)
上一篇 2022年5月3日 02:03
下一篇 2022年5月3日 02:07

相关推荐

发表回复

登录后才能评论