1 秒杀有哪些特点

常见的场景比如100000人在同一秒抢一个手机。比如12:00:00抢购, 12:00:01活动就结束了

1.1 突然多了很多访问,可能导致原有商城瘫痪

秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必然会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪。

解决方案:将秒杀系统独立部署,独立域名。

1.2 带宽问题

假设商品页面大小1M(主要是商品图片大小),那么10000用户并发,需要的网络带宽是:10G(1M×10000),这些网络带宽是因为秒杀活动新增的,超过网站平时使用的带宽。

解决方案:因为秒杀新增的网络带宽,必须和运营商重新购买或者租借。为了减轻网站服务器的压力,需要将秒杀商品页面缓存在CDN,同样需要和CDN服务商临时租借新增的出口带宽。

1.3 有大部分请求不会生成订单

接入层(nginx)漏桶限流。真正进入php和mysql等应用层的流量极少,大多被过滤

1.4 超卖问题

秒杀商品的数量是有限的。

mysql如何实现防止超卖_网络带宽

上面这个是会超卖的,不并发的时候是可以的, 万一并发,2个人都会抢购成功

2、超卖问题解决思路:

我们这里使用 nginx+lua+redis乐观锁代码 实操解决,如下:

第一步:搭建redis集群,我们这里,在192.168.188.130 这台机器上,使用docker搭建redis集群:

mysql如何实现防止超卖_redis_02

如上图 ,我们新建了redis集群且模拟设置了 乐观锁参数:set watch_key 1000 方便后续测试 和商品库存 :set sku_num 1。

第二步:在另一台机器上新建nginx+lua 环境:这里,我们在192.168.188.131 机器上搭建:如下为主要nginx配置信息:

mysql如何实现防止超卖_redis_03

如果下为lua 文件的主要配置,主要通过3层防护来保证超卖问题的解决::redis 集群、漏桶算法、redis 乐观锁,如下所示:

mysql如何实现防止超卖_mysql如何实现防止超卖_04

mysql如何实现防止超卖_mysql如何实现防止超卖_05

mysql如何实现防止超卖_redis_06

3、jmeter 压测检验;

mysql如何实现防止超卖_nginx_07

mysql如何实现防止超卖_redis_08

mysql如何实现防止超卖_mysql如何实现防止超卖_09