已阅读
用免费CDN加速秒杀系统需要注意的点
秒杀的特征?
短时间内并发量高
秒杀系统需要注意的问题?
1、前端优化
2、防止超卖
3、频率限制
前端优化:
1、将静态资源(js,css,img)等,存放到七牛云静态资源服务器,七牛云静态资源服务器能够实现CDN内容分发,将静态资源缓存到全国各个节点,能够减少服务器的带宽传输。从而提高宽带传输速度。
2、使用maven插件自动对静态资源实现压缩,每次发布的时候使用版本号更新静态资源。
如何防止超卖?
1、不用version版本如何实现乐观锁,where 库存>0
在mysql中,更新数据库时,有行锁,会成为单线程
2、乐观锁先查询版本号,在将版本号作为参数传递
谁快谁能拿到锁,能修改成功
两者的区别:第一种属于行锁,悲观锁,效率低;第二种是乐观锁
频率限制:
redis setNX 超时
为什么秒杀单独以微服务形式部署?
不影响其他服务,docker实现快速扩容
如果秒杀请求过多,对数据库频繁的io操作,可能会产生数据库崩溃问题,该如何解决?
首先,分表分库没用,不能从根本上解决问题,应该提前生成好令牌,放在令牌桶中,谁能抢到令牌,然后在异步发送到MQ,然后修改数据库信息(令牌key 商品库存id value 集合 list)
秒杀总结:
前端:
1、动静分离,静态资源存放在第三方文件服务器实现cdn加速,目的减轻秒杀的抢购带宽
2、当用户点击秒杀按钮,应该将按钮置灰,防止重复提交
3、使用复杂的图形验证码防止模拟
4、秒杀详情页面,使用定时器查询用户秒杀结果
5、商品详情页,使用nginx+lua+openresty实现静态化页面
网关:
1、ratelimiter,nginx,redis,hystrix
令牌桶+漏桶算法 对用户的秒杀请求进行限流和服务的保护
2、用户黑名单和白名单拦截
秒杀接口:
1、服务降级,隔离,熔断
2、获取redis的令牌桶(如果能得到token就能秒杀)
3、异步使用MQ执行修改库存操作
4、根据用户信息查询秒杀结果
项目部署点:
nginx+lvs实现高可用和集群