关于秒杀系统

 1:场景

现在刚出了新的华为手机 当然是限量的,只有200台,但是有成千上万的人惦记着,很多人去抢这一台!

2:问题

2.1:数据库

数据库压力承受不了每秒上万甚至几十万的(QPS 每秒请求数量)直接访问数据库,数据库当然直接是挂掉给你看,而且微服务不单单做秒杀还有涉及到其他的服务,没做降级,限流,熔断,一开始抢,那全站都是崩溃的404!(当然我们期待就算没抗住秒杀,数据库崩了,服务挂了,我们的其他服务还是可以运行的)

解答:服务单一职责(没抗住秒杀,数据库崩了,服务挂了,我们的其他服务还是可以运行的)

单一职责:既能抗住高并发,对于秒杀我们单独给它创建一个数据库(刚好和我们微服务开发思想一致 分布式方式)

2.2:链接

url链接暴露了,有人直接访问url提前秒杀

解答:

其实很多人会想到做个时间的效验就可以了,(这个是不安全的),知道了url,通过程序不断获取最新的北京时间,可以达到毫秒级别,这样就会出现你有多少个产品,都被我秒杀完了!

这种情况:把url动态化 通过MD5之类的加密算法加随机的字符串去做url,然后通过前端代码获取后台效验才能通过!

2.3:服务器压力大

tomcat并发量才几百,但是Nginx(高性能的web服务器)有几万的并发量还是很可观的

解答:Tip(Nginx优点)

高并发。静态小文件
占用资源少。2万并发、10个线程,内存消耗几百M。
功能种类比较多。web,cache,proxy。每一个功能都不是特别强。
支持epoll模型,使得nginx可以支持高并发。
nginx 配合动态服务和Apache有区别。(FASTCGI 接口)
利用nginx可以对IP限速,可以限制连接数。
配置简单,更灵活。

2.4:太多的访问量每次加载页面太慢了

太多的访问量每次加载页面太慢了

解答:页面静态化

秒杀一般都是特定的商品还有页面模板,现在一般都是前后端分离的,所以页面一般都是不会经过后端的,但是前端也要自己的服务器啊,那就把能提前放入cdn服务器的东西都放进去,反正把所有能提升效率的步骤都做一下,减少真正秒杀时候服务器的压力。

静态页面和动态也免得差距

  • 静态页面访问路径短,访问速度快,几毫秒
  • 动态页面访问路径长,访问速度相对较慢(数据库的访问,网络传输,业务逻辑计算),几十毫秒甚至几百毫秒,对架构扩展性的要求更高
  • 静态页面与动态页面以不同域名区分

2.5:会有人提前一直点击,服务器压力大(前段)

       后端限流(是根据前端结束秒杀才结束的)

解答:限流


限流这里我觉得应该分为前端限流后端限流

前端限流:这个很简单,一般秒杀不会让你一直点的,一般都是点击一下或者两下然后几秒之后才可以继续点击,这也是保护服务器的一种手段。这里可以做一个,按钮控制(即在秒杀没有开始之前点击按钮是灰色的,只有再开始的时候才恢复可用状态)

后端限流:秒杀会涉及到订单,支付问题,当订单生成支付成功MQ收到消息,给数据库才完成整个秒杀流程,但是最后一个幸运儿完成后 前端的秒杀就会关闭,然后后端就会返回一个false!

Tip:真正的限流还会有限流组件的加入例如:阿里的Sentinel、Hystrix等。就说一下物理的限流。

2.6:数据库访问查询库存然后扣减库存,撇开性能因数,而且数据库顶不住啊。

解答:用redis做缓存

业务逻辑:

获取秒杀商品数据与库存量数据,如果没有库存则抛出异常

执行redis预扣减库存,并获取扣减之后的库存值

如果扣减完的库存值<=0, 则删除redis中对应的商品信息与库存信息

基于mq异步方式完成与mysql数据同步(最终一致性)

非关系型的数据库Redis开始秒杀前你通过定时任务或者运维同学提前把商品的库存加载到Redis中去,让整个流程都在Redis里面去做,然后等秒杀开始了,再异步的去修改库存就好了。

2.7:如果redis采用主从,就是我们会去读取库存然后再判断然后有库存才去减库存,正常情况没问题,但是高并发的情况问题就很大了。(举例 就是一个商品,同时多个服务器下单 都减去了库存 超卖了)

解答:lua

Lua脚本是类似Redis事务,有一定的原子性,不会被其他命令插队,可以完成一些Redis事务性的操作。这点是关键。

知道原理了,写一个脚本把判断库存扣减库存的操作都写在一个脚本丢给Redis去做,那到0了后面的都Return False了是吧,一个失败了你修改一个开关,直接挡住所有的请求,然后再做后面的事情嘛。

2.8:你买东西少了你直接100个请求改库我觉得没问题,但是万一秒杀一万个,10万个呢?服务器挂了,程序员又要背锅的

解答:用消息队列

你可以把它放消息队列,然后一点点消费去改库存就好了嘛,不过单个商品其实一次修改就够了,我这里说的是某个点多个商品一起秒杀的场景,像极了双十一零点

补充:限流&降级&熔断&隔离:

限流,顶不住就挡一部分出去但是不能说不行,降级,降级了还是被打挂了,熔断,至少不要影响别的系统,隔离,你本身就独立的,但是你会调用其他的系统嘛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值