作为程序员一定要保持良好的睡眠,才能好编程

秒杀大流量优化方案

发布时间:2019-03-21

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、通过上面的几个步骤,就可以将接口静态化处理了!