本文主要是介绍超实用,一文读懂高并发处理之道(务必收藏点赞转发哦),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这篇文章请你务必收藏,点赞,转发。
目前还是初稿,初稿,所以你得收藏,时不时来看看。
请给我时间,我得慢慢来改,也请大家一起来参与,如果你有更多的实践,也可以留言交流。我后续还会添加更多的图,更详细的内容,这篇文章将会很长,但是我尽可能通俗简单的来讲述,相信你读完一定会有所收获,我会尽最大可能努力打造一篇不可多得的能让你获得提升的文章。
如果你现在出去面试技术岗,哪怕就是个初创公司,很多面试官也经常会问你如何处理亿级用户的高并发问题,我们今天来好好聊聊这个问题,我想尽可能简单的来说这个问题。
技术永远不是凭空产生的。
技术一定是在需求下产生的,技术是人创造的,那么它一定体现的就是人的思想。
技术一定是因为存在某种需求,为这些需求而服务的。技术都是人造出来的,它一定体现的是人的思想,所以不要把它看的有多高大上。要从心理上藐视之。
让我们秉持创业的初心,从一家小店干起,就从创业开始吧!干点啥呢?开个饭店吧!
一开始,咱就是个小饭店,顾客既不多,客流也不稳定,但是我们还是得有个饭店该有的样子对吧?你得有大厨吧?得有跑堂的吧?得有收银的吧?有后厨还得有杂工吧?麻雀虽小五脏俱全,这些构成了一个饭店,嗯,饭店做到这样,我们就可以开店迎客了。
后来,我们做的饭菜声名远播,来的客人越来越多,来的人越来越多,越来越多,越来越多,但是店小啊,根本坐不下啊!店都要被挤爆了啊,这怎么办呢?
俗话说,来的都是客,你不能赶客人走吧?那么这个时候,你得有个人安排吧?店里招待不下啊,你的备菜,食材可能都不够啊!所以这个时候你得限制,比如每个人只能点一份,不可多点,然后人多得有秩序,所以要排队,但是这样还是扛不住啊,那怎么办吧?讲道理,这种情况老板肯定是非常开心的啊,这生意做的,睡梦都能笑醒了。
从古到今,大道至简,道理都是相通的。
天下虽大,分而治之。
天下即便再大,周天子一个人哪管的过来?那就每个地方分个王去管就好了啊,所以周天子分九州,之后就有了齐楚燕赵韩魏齐秦周这九个国家,周天子坐拥九州称帝,每个板块交给每个王去处理就好了啊!
自古以来,道理都是相通的,太阳底下没有新鲜事!
那这个时候人太多了,生意做大了,很简单嘛,开分店啊!一个店扛不住,来它10个店,分流嘛!现在每个店都只有原来十分之一的压力了,虽然你店开起来了,但你还要做好调度对吧?不然虽然你有10家店,但是大家都涌向了某一两个店,其他的店闲置,这就违背本意了对吧?
是的,现在我们生意做大了,我们有10家店,然后经过我们的合理调度,10家店都运转良好,每家店服务1000人,10家店就可以服务1万人了,生意真的是做大了呢!
但是我们怎么降低成本呢?怎么样能让利润更上一层楼呢?继续优化,10家店,每家店都是一样的,那么它们有很多都是同样的服务,比如财务,再比如后厨,再比如杂工,这些人和事物都是一样的,但是顾客去每家店的时间段可能是有差异的,所以就存在某些时间点某些店很忙,但另一些店很闲,而且很多人是繁杂的,要把他们高效利用起来啊!不能让他们闲着啊!那怎么优化呢?
分部门,是的,现在同样还是10家店,每家店都有很多同样的工作要处理,比如每家店都要处理财务问题,然后每个店处理完了要汇总,又要核算,整个过程非常麻烦,那么现在成立财务部,直接管理,省去中间流程,财务部直接管理10家店,哪个店需要处理财务工作财务部就出动去处理。再比如大厨,原来每家店都是自己的大厨,然后有的时间点他们就很闲,要让他们忙起来,所以就组建大厨部门,综合调度,哪个店需要就去哪个店。
所以,理想的情况下,我们发现了,后来我们成立了一个个的服务部门,哪个地方需要什么服务就让这个服务部门去处理,高效执行。
现在让我们把思考转向我们的程序开发。
初创公司,业务量根本不高,核心的问题是解决业务需求,实际上并不会有什么并发量,因此这个时候就像我们初创,一个店就可以了,单机就可以了。
再然后走向下一个台阶,业务量上来了,单机搞不定了,那么我们很简单嘛!就部署多套嘛!单机不行,那就十个机一起上!
进入到第三个阶段,我们很容易发现,第二阶段的简单拆分,实际上有很多东西都是重复的,因为每个都是一样的,自然都是重复的,所以我们进行了部门服务化,我们减少了这种重复,让每一个原来重复的事情都变成了一个个部门,一个个服务,你需要什么服务?就去找什么服务。
这就是一个公司发展的历程,这同样也是程序发展的历程。
我们接着细聊:
老板的钱也是一点点赚出来的,老板也不是啥有钱人,他还靠着你们给他赚钱呢!如果开分店那么容易的话,老板早全世界都开满店了,所以,开分店也不是那么容易的事,地段、房租、客流量都是因素,我们现在客流量是大,但还不足以大到支撑2家分店的情况,请尽可能在一家店解决,毕竟,即使开第二家店也是要考虑很多的。
那么,现在我们只有一家店,如何尽可能的招呼住更多的客人呢?
首先,你是不是得把那些闹事的,不是来吃饭的闲杂人员清理出去,所以咱们得做拦截,只接受真正的有需求的客户来,那些闹事的得拦在店外,不能让他们进去,其次,尽可能扩大单店的使用面积,尽可能接纳更多的客人,如果这样不行,就给客人排队,人太多,排队是最自然的需求对吧?排队的话可能又会分级,分为VIP队和普通队伍,这没什么不好理解的对不对?
好,说回我们程序的问题,一开始规模小,大都是单体应用,直接,业务能很快跑起来,那么现在这个时候,我们要如何提高单机的效率?自然和上面的道理是一样的,客户端前端首先自己要做保护,只向服务端传递合法有效的信息,如果是同类信息,要做合理的拦截,同一个用户疯狂的请求,客户端首先就不应该把这种情况发到服务端去,前边首先要拦住。
服务端要不要做拦截呢?自然也是要的,我们知道很多的攻击可能不是来自你的客户端的,你要想办法减少这种来自第三方的请求,只接受合理合法的自己家的请求,因为我们现在只有单机,只有一家店,我们要撑住,那么你就要看,怎么接住?自然是优化单机的处理能力,想办法提升整个程序的运行速度,换更好的机器,对各种服务配置做更适合的配置,总之就是提升单机的处理能力,这样往往不够,那么我们就采用排队的方式来处理,机器的处理能力最多就那样了,单店最多也就能撑住1000人,没办法了,那就是排队,把VIP客户先处理,其他的可以后处理,反应在我们的程序上,其实就是看你怎么处理嘛,有些东西可以往后面放,那你就把它放到后面去慢慢处理,这叫服务降级,比如日志分析这种功能,你没必要在吃饭的这个时候非要加入一层日志分析吧?
所以单店就是这样,单体单机我们就是不断的优化这里面的每一个进程,怎么让它处理的更快更有效率。
当我们单店达到极致的时候,这个时候单店必然扛不住了,那就考虑多店一起扛,单店最大也就能招待1000人,来10000人自然是不成的,这个时候我们就把我们优化的很好的单店复制到多家店,这样每家店压力自然小了,就能扛下来了。
现实中开店是很贵的,同样程序中开店也是很贵的,现实中你钱够了可以开店,钱少了你也可以摆个摊嘛!程序也一样啊!如果钱多,咱们就全买机器了,直接往机器上搞起,但是很贵啊!哪个老板也不可能让你无限加机器,那都是要花钱买的,机器是有限的,所以我们在有限的硬件机器上发展出来了虚拟的机器,就是虚拟机技术,还不是因为买机器要花钱!还有很多事,比如维护、人工、水电等等,虚拟机相对实体机自然是省钱不少,但是虚拟机本身也有很多开销啊,这些开销又不能用在真正需要的算力上,浪费了。
这个你可以自己测试自己模拟,开几个云服务器来调度,你自己看看你的这些云服务器间怎么协同,怎么处理业务,模拟高并发,我们可以自己通过云服务器来模拟这种场景,提升我们处理这种事情的技术能力。
云服务器的话很便宜,我自己也买了很多,我一般都是买阿里云的,如果腾讯云比阿里云更便宜,我也会去选,记得使用优惠,可以便宜不少。微信和支付宝认证起来也都方便。以下是相关优惠信息,需要的看看看。
阿里云限量红包,不要钱,直接领。
云小站_专享特惠_云产品推荐-阿里云上云优惠聚集地,新人专享优惠价格,可叠加专享代金券购买价格更低。https://www.aliyun.com/minisite/goods?userCode=v6vhcyn8【腾讯云】新客户红包。
腾讯云优惠券_代金券_云服务器折扣券-腾讯云腾讯云优惠券,腾讯云代金券,腾讯云服务器折扣券https://cloud.tencent.com/act/vouchers/list?fromSource=gwzcw.2477393.2477393.2477393&utm_medium=cpc&utm_id=gwzcw.2477393.2477393.2477393&cps_key=b0c7af9380d6324294316347ba2c8a49阿里云家最新活动信息
最新活动_阿里云最新活动,阿里云最全的优惠聚集地https://www.aliyun.com/activity?userCode=v6vhcyn8腾讯云家最新活动信息
腾讯云11.11大促_腾讯云11.11优惠活动-腾讯云腾讯云推出11.11智惠云集活动:爆品秒杀,企业专享优惠,低至1折起;企业抽奖活动,100%中奖;免费领取11000元代金券!https://cloud.tencent.com/act/double11?from=pre-2021double11&spread_hash_key=3d5d628c89ca2247f5f05604d3ae5c3a阿里云腾讯云所有优惠汇总,全都在这里了。
浅谈VPS云服务器(内含神秘大额专属特惠)_zhumengyisheng的博客-CSDN博客怎么做一个网站?都需要什么?要个服务器?要个域名?去哪里买?哪个好啊?有优惠吗?所有的优惠都在这里了,给自己建个网站吧,毕竟要学以致用啊!https://blog.csdn.net/zhumengyisheng/article/details/121391896 买上几个云服务器,你可以做做测试,看看它们之间怎么沟通,怎么通信,怎么分配,事情怎么处理,模拟模拟真实的场景,自然能极大的提升你处理高并发的能力。
所以我们下一步需要的就是如何降低虚拟机的自耗?
我们要的是尽可能的提升我们程序的处理能力,我们自然不愿意把过多宝贵的服务器资源浪费在系统本身耗费上,但是我们又要服务器本身的支撑处理能力,服务器成本太高,就算用虚拟机还是内耗太大了,因此我们想要更低的内耗,把有效的算力尽最大可能都用到程序处理本身上去。
因此docker之流出现了,相对虚拟机而言,它更加的优秀,自耗更少,因此可以把算力最大可能的用在程序本身上。
伴随着docker出现的技术叫分布式微服务技术,其实docker这东西这没什么不好理解的,你想一个公司的业务是很多的,同一个业务有各种各样的功能,一个大功能会包含很多个小功能,就像我们写函数一样,你得小啊,你不能写一个很大的函数,因为这个函数内部有很多东西可能是要复用的,这里要用那里也要调用,你这里用了,人家那里也要用,所以我们就分成了一个个很小的功能点,每一个功能点就是一个服务,这样的话,你哪里要用,你就来取嘛,如果你做的大了,那人家怎么取?所以得做小,所以叫微嘛,微服务。
什么是微服务?微就是小的意思啊,就是一个个的小服务,不能太大啊,大了你就包含了很多个小功能,那里面的功能可不仅你这里用,其他地方也要用啊,所以不是就又重复了嘛,所以要小。
上面我们看到了微服务的好处,它把一个事情分成了一个个很小的服务功能点。
(一个)微服务是一块砖,哪里需要哪里搬。
是的,微服务这种模式很优秀,它极大的解决了我们重复的问题,但是它同样有问题啊,微服务太小了,一个项目要好几百个小功能点,那就可能是好几百个微服务,这样的话维护起来就会很麻烦,原来的单体应用只需要维护一个,后来微服务优秀的解决了高并发,一个微服务会起很多个docker,这样的话项目的维护成本很高!
现在服务太细了,维护又费劲,那怎么办呢?
所以,互联网永远在造词,但是你不要被它骗了,它们都是特定需求下逼出来的产物,然后起了个名字。
现在你知道了什么叫微服务,后来它们又来个新名词:中服务。
你还没搞懂微服务,这中服务又是啥?
其实很简单嘛,需求下的产物而已,我们知道微服务很小,维护起来困难,为了减少维护的困难,那么服务你就不能拆的太小,你得把同类相似的,经常一起调用的那些打包提供,对吧?很简单嘛!洗澡是个服务,游泳也是个服务,洗头也是个服务,它们都是一个个单独的服务,但是这三个服务往往是一起提供的对吧?你去游完泳,是不是得洗个澡?洗澡的时候是不是得洗个头?所以这三个一般都是一起出现的啊!那就把这三个打包一起提供,这个服务就是中服务。
所以中服务根本就不是什么新鲜名词,无非就是不那么细的微服务,减少维护困难!
永远要记住:技术从来都不会凭空产生,技术一定是在需求下产生的,技术是人创造的,那么它一定体现的就是人的思想,人写出来的东西,它怎么可能不是人的思想呢?
如果你想学习更多的编程相关知识,可以看看我写的系列文章:
态度篇(这是我唯一希望你认知到的东西,你可以什么都忘了,但态度得端正。)
为什么985高校还是在上C语言?这难道不是大学教育的失败? 为什么现在985高校还是上C语言课?_zhumengyisheng的博客-CSDN博客现在工作它们不都在找java、PHP、golang之类的吗?可是为什么985大学了居然还在教学生古老的C++啊?这不是误人子弟?这难道不是大学教育的失败?https://blog.csdn.net/zhumengyisheng/article/details/121391642
计算机那么好,为什么计算机专业出身的很多人毕业都转行不搞计算机了? 计算机那么好,为什么计算机专业出身的很多人毕业都转行不搞计算机了?_zhumengyisheng的博客-CSDN博客计算机那么好,为什么计算机专业出身的很多人毕业都转行不搞计算机了?为什么挤破头都抢不上的计算机专业,毕业工资那么高,分分钟年薪几十万,那他们为什么要转行呢?这里面到底有什么不为人知的秘密?到底是什么想不开让他们放弃了如此大好钱程前程?https://blog.csdn.net/zhumengyisheng/article/details/121391821
学习篇
编程语言第一课 入门 程序员的道与术
程序员的道与术_zhumengyisheng的博客-CSDN博客什么样的程序员才是好的程序员?程序开发学习到底是在学什么?你适合学习程序开发吗?编程语言众多,如果要学习我到底该学习哪一种?程序员的道与术,讲述那些不为你知的秘密https://blog.csdn.net/zhumengyisheng/article/details/121391210 编程语言第二课 晋级 不忘初心 方得始终
不忘初心,方得始终_zhumengyisheng的博客-CSDN博客难道我们学习程序就是学一堆一堆的框架吗?难道学习程序就是学一堆一堆的套路?如果不是,那我们到底又该学什么?程序的本质又是什么?本文将给你答案https://blog.csdn.net/zhumengyisheng/article/details/121391458 编程语言第三课 深入 想法也疯狂,创造一门语言
想法也疯狂--创造一门语言_zhumengyisheng的博客-CSDN博客开天辟地走一遭学了那么多语言,敢不敢挑战一次自己,创造一门语言?语言从来都不是天生的,它们都是人写出来的,既然别人能写,那你能不能写?如果要创造一门语言,那么到底该怎么创造?https://blog.csdn.net/zhumengyisheng/article/details/121391567
我永远有句话送给你:
教程从来都不是最重要的东西,最重要的是你的学习态度。
认真学习,刻苦专研,严谨求知的态度,坐的了冷板凳,强大的肾功能,最后再乘以时间,后积才能薄发。从来都是:
台上一分钟,台下十年功。
哪个行业里那些拿高薪的人不是如此?没有人可以随随便便成功。
感谢阅读,感谢关注支持我!愿你幸福,愿你追逐的所有梦想都实现!
这篇关于超实用,一文读懂高并发处理之道(务必收藏点赞转发哦)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!