1、单用户单浏览器登录
2、开启gzip压缩输出
3、开启本地缓存,将静态文件、图片进行缓存 利用cdn加速
4、web集群设置
5、程序接口静态化 采用 nginx 伪静态的方式去请求接口,倘若数据一旦超过秒杀则系统创建一个 js文件,则以后所有的请求,均请求js文件
6、使用redis 缓存服务器,缓解mysqldb的访问
倘若redis的访问也是特别大,则采用redis sentinel 高可用部署服务器,防止缓存服务器崩溃
7、抢购信息采用redis list 或 zset有序结合进行保存,异步消费队列到mysql数据库
8、异步消费,读取队列信息,持久化到数据库
为了防止秒杀出现问题,采用 提前演练、压力测试 。
秒杀系统有一个叫短板效应,比如说 水桶共计有10块木板围成,那么 最短的一块,就是水桶 盛水的容量
所以说 任何秒杀系统 任何一个环节都是非常重要的。
演练注意环节:
1、任何一个页面 对所有页面进行压力测试
2、接口的压力测试 可以减少内存的使用
补充一些题外话:
nginx 处理静态文件,每一秒的处理大概在1w左右 ,这是单机压力测试
倘若部署在局域网,那么压力测试有可能就是 5000-6000 之间,这是网络之间传输的耗时
如果放在万维网中,那么就会更多的消耗了,可能只有1000-2000
如果在接入 php 动态脚本处理的话,大概就只有 300-1000 了。
整体消耗就是这个原理,上边的数据只是一个简单的评估、具体数值,是根据几次压力测试,求得的一个平均值
接口静态化:
倘若 http://172.28.81.174:8005/acc.js 这是抢购的一个接口
有疑问了,为什么这是一个 .js 文件呢?
我这里使用了 nginx 的 重写功能, 将acc.js 文件重定向到了 acc.php 来处理,
acc.php 是抢购的脚本处理,负责 接收参数、验证数据、检验库存、是否可以购买、下单 等操作,
在检测库存的时候,倘若已经是 0 了,那么就在根目录下生成一个 acc.js 静态文件,内容是一个json文件,大致意思就是
$arr=[
'code'=>1005,
'message'=>'商品已卖完,请下次再来购买'
];
的一个json字符串,如果有请求进来,则会直接访问 js 文件,直接将内容返回。
为什么这样做:
这样做的好处,就是 nginx 只是访问静态文件 js ,防止再次去访问 php 。减少了 没有库存的情况下,还要去php处理。
这样做的好处,就是 我们 只售卖10个商品,现在已经卖出10个,那么后面所有的请求都会失败。在js端就直接失败了,没必要请求php了。
实现步骤:
1、未到抢购时间,
提前建立一个acc.js 文件,大概意思就是 未到抢购时间
返回内容 是 尚未开始抢购哦
2、已经到了抢购时间
服务器脚本 shell 会自动 删除掉 acc.js 这个文件
delete.sh
#!/bin/bash file="/usr/local/nginx/html/shorturl/acc.js" if [ -e $file ]; then rm -rf $file fi
linux 服务脚本 采用 crontab 或 at 来定义时间,自动处理
通过nginx 配置的 acc.js 重写机制 到 acc.php 这个文件,进行业务处理
nginx的配置:
if (!-e $request_filename) { rewrite "^/acc.js$" /acc.php last; }
3、acc.php 当抢购商品的数量达到了10个,php 生成 acc.js 文件,这个文件一旦生成,后面所有的请求,会走到nginx
不再会进入到php中了
4、通过上面的几个步骤,就可以将接口静态化处理了!