秒杀系统设计分析

秒杀系统本质上需要构造一个高并发,高可用的分布式系统。我们可以依据秒杀系统设计的原则来归纳可以采用的方法。

秒杀系统设计原则:4要1不要

数据要尽量少

数据量越大,网络传输,数据处理的时间就越长,最终会影响到数据处理的性能。
减少无效的数据,数据压缩等等。

数据请求次数要尽量少

数据请求次数主要包括:前端静态数据请求如:HTML,css,JS,图片等;来自后端的动态数据;数据的每一次请求都会有tcp网络时间消耗,应用服务器处理时间消耗等。
优化方案: css/js/图片请求合并。

单个请求的路径要尽量短

一个数据获取从A-->B-->C--->D变为:A-->B;由于经历的链路变长,导致单次请求的响应时间变长。

依赖要尽可能少

一个页面的数据,比如商品详情,需要商品基本数据,促销信息,区域信息等等;由于这些信息都是来自不同系统,减少不必要的信息依赖,可以增强系统的稳定性和请求数据的量。

不要有单点

主要是保持系统可靠性。

热点数据优化方案

通常对热点数据的处理思路主要有:热点数据缓存,热点数据限制访问阈值,隔离热点数据,避免对其他的数据造成影响。

动静数据分离方案

依据上面讲到的四个原则,在动静数据分离的基础上,可以尽可能加大静态热点数据的缓存,这样可以提高数据的读写性能,减少数据请求的链路,减少数据请求的次数。

动态数据的静态化

将http请求对应的响应数据直接缓存到web代理服务器,如Nginx。

二是将静态数据缓存到离用户最近的地方

数据可以尽可能,缓存在离用户最近的地方,如用户浏览器、CDN、Nginx代理服务器、服务端缓存中(内存缓存)

静态数据缓存方案

web代理,缓存,应用服务统一部署在一台机器上,再以集群的方式部署。

优缺点
1、没有网络瓶颈,而且能使用大内存;
2、既能提升命中率,又能减少 Gzip 压缩;
3、减少 Cache 失效压力,因为采用定时失效方式,例如只缓存 3 秒钟,过期即自动失效
在这里插入图片描述

统一 Cache 层

优点:
1、单独一个 Cache 层,可以减少多个应用接入时使用 Cache 的成本。这样接入的应用只要维护自己的 Java 系统就好,不需要单独维护 Cache,而只关心如何使用即可。
2、统一 Cache 的方案更易于维护,如后面加强监控、配置的自动化,只需要一套解决方案就行,
3、统一起来维护升级也比较方便。可以共享内存,最大化利用内存,不同系统之间的内存可以动态切换,从而能够有效应对各种攻击。
缺点:
1、Cache 层内部交换网络成为瓶颈;
2、缓存服务器的网卡也会是瓶颈;
3、机器少风险较大,挂掉一台就会影响很大一部分缓存数据。
在这里插入图片描述

上CDN方案

将商品详情系统放到全国的所有 CDN 节点上是不太现实的,因为存在失效问题、命中率问题以及系统的发布更新问题。那么是否可以选择若干个节点来尝试实施呢?答案是“可以”,但是这样的节点需要满足几个条件:
1、靠近访问量比较集中的地区;
2、离主站相对较远;
3、节点到主站间的网络比较好,而且稳定;
4、节点容量比较大,不会占用其他 CDN 太多的资源。
在这里插入图片描述

热点数据识别

可以提前预测的热点数据
人工标识
动态热点发现系统

热点数据写优化

###库存扣减热点数据优化

存在的问题,MySQL中单个商品数据的写,存在对行级锁的占用,并且会应用0.01%数据导致其他99.99%的数据不能使用。

秒杀峰值流量应对

秒杀开始那一秒是一条很直很直的线,这是因为秒杀请求在时间上高度集中于某一特定的时间点。这样一来,就会导致一个特别高的流量峰值,它对资源的消耗是瞬时的。但是对秒杀这个场景来说,最终能够抢到商品的人数是固定的,也就是说 100 人和 10000人发起请求的结果都是一样的,并发度越高,无效请求也越多。

但是从业务上来说,秒杀活动是希望更多的人来参与的,也就是开始之前希望有更多的人来刷页面,但是真正开始下单时,秒杀请求并不是越多越好。因此我们可以设计一些规则,让并发的请求更多地延缓,而且我们甚至可以过滤掉一些无效请求。

最终期望达到的目标:延缓用户请求发出,过滤或减少一些请求打到数据库。

应对方案

排队

消息队列方案
线程池加锁
内存排队
序列化到文件

架构方案
在这里插入图片描述

答题

防止作弊
延缓请求,将峰值请求数所处的时间区间拉长

架构方案
在这里插入图片描述

分层过滤

分层过滤主要目标是防止过滤的读写请求,进入到流量漏洞模型的下层。
针对读请求,主要是通过缓存的形式,讲数据请求拦截在上层。
针对写数据,主要是写数据做限流保护,超出系统承载能力的请求过滤掉,对写数据进行强制校验,只保留最后有效的数据

分层过滤的架构模型
在这里插入图片描述

限流,机器保护

秒杀过程中存在重点问题

缓存问题
超卖问题
恶意请求
链接暴露
数据库瓶颈

秒杀过程中的高可用方案

产品研发流程中涉及到保障系统高可用的措施,总结下来如图所示:
在这里插入图片描述

降级

当系统的容量达到一定程度时,限制或者关闭系统的某些非核心功能,把有限资源给核心业务

限流

限流就是当系统容量达到瓶颈时,我们需要通过限制一部分流量来保护系统,并做到既可以人工执行开关,也支持自动化保护的措施。
限流方式有:
URL级别的限流
QPS限流
线程限流
限流的位置有:
客服端限流
服务端限流

拒绝服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sjhzjj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值