上面这个结果,对于秒杀系统来说,肯定是非常不理想的。
如果能将处理程序耗时优化后,降低到10ms,那么就可以达到800qps。
如果我们可以把程序继续优化,能快速区分开有库存和无库存处理,那么无库存时处理就有可能做到1ms甚至更低的耗时。这样无库存时就能有更好的性能,上万的qps也是可以达到的。
上面的预估,都是针对单机,那么简单的增加前端服务器,是不是就能有更好的并发处理量呢?
肯定没这么简单,因为数据库、缓存系统甚至机房网络带宽都会成为瓶颈。
于是就要有一个更好的分布式方案。
第四:好的分布式方案
一个好的分布式方案,首先当然是稳定可靠,不要出乱子,然后就是方便扩充,最好的效果当然是增加一台服务器,并发处理量可以1:1线性增长。
比如:单机qps是1k,那么10台服务器可以做到1w,100台可以做到10w每秒。
要做到这样的线性增长效果,就要杜绝出现瓶颈,否则还是会代价太大。
拒绝假的分布式尤其重要,比如:前端服务器是可以独立存在的,但是都依赖集中的一个数据库或者缓存系统,那最后,一定是集中的那个数据库或者缓存系统受不了,同样无法做到一个好的分布式。
第五:关注系统的瓶颈
大家先有几个基本的共识,系统的处理速度
程序内数据读写 > redis > mysql > 磁盘
单机网络请求 > 局域网内请求 > 跨机房请求
我们优化程序的时候,尽量用最快的方式,尽量用最简短的逻辑。
用redis替代mysql来保存订单处理中依赖的数据,用程序中的提交的数据代替从redis中二次获取数据,比如:商品库存信息,用户订单信息。
逻辑处理中,把速度快且提前中断的逻辑放在最前面,比如:验证登录,验证问答。
我们做分布式方案的时候,尽量把资源调用放在最近的地方。
前端服务器依赖的数据尽量就在局域网内,如果能在单机都有读的redis服务当然更好,程序维护数据响应会复杂些。
不要出现跨机房网络请求,不要出现跨机房网络请求,不要出现跨机房网络请求,重要的事情说三遍。
第六:什么语言更适合这类系统
当然,像是用golang, ngx_lua可能在高并发和性能方面会更有优势。
如果使用java、php当然也是可以的,作为一个系统,语言只是工具,更好的设计和优化,才能达到最终想要的效果。
有了上面的基本概念,我们接下来再来看看,具体运行时,会出现什么状况。
下面是一些具体的实现问题:
问题1:库存超卖
只有10个库存,但是一秒钟有1k个订单,怎么能不超卖呢?
核心思想就是保证库存递减是原子性操作,10–返回9,9–返回8,8–返回7。
而不能是读取出来库存10,10-1=9再更新回去。因为这个读取和更新是并发执行的,很可能就会有1k个订单都成功了,而库存实际只有10。
那么,怎么保证原子性操作呢?
1 数据库:
update product set left_num=left_num-1 where left_num>0;
这里用到的是left_num=left_num-1,如果left_num>0才能执行成功,数据库查询、更新的时候有用到锁,是可以保证更新操作的原子性的。
数据库性能较差,不建议使用。
2 分布式锁
用redis来做一个分布式锁,reids->setnx(‘lock’, 1) 设置一个锁,程序执行完成再del这个锁。
锁定的过程,不利于并发执行,大家都在等待锁解开,不建议使用。
3 消息队列
将订单请求全部放入消息队列,然后另外一个后台程序一个个处理队列中的订单请求。
并发不受影响,但是用户等待的时间较长,进入队列的订单也会很多,体验上并不好,也不建议使用。
4 redis递减
通过 redis->incrby(‘product’, -1) 得到递减之后的库存数。
问题2:集群怎么来规划
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。
针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。
。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。
针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。
[外链图片转存中…(img-0KmEw2Iz-1712088001590)]
[外链图片转存中…(img-1auYGn1I-1712088001590)]
[外链图片转存中…(img-misbe8u1-1712088001590)]