原创作者 | L的存在
说到后端开发,难免会遇到各种所谓高大上的「关键词 」,对于我们应届生小白,难免会觉得比较陌生,因为在学校确实比较少遇见这些所谓高大上的东西,那么今天就带着学习的态度和大家分享这些看似可以装逼可以飞的带逼格的关键词吧。
大纲
分布式
在学校里的项目中,一个 Web 系统可能咋们一个人就搞定,因为几乎不考虑并发量,性能咋样,所谓「过得去 」足矣,但是为了面试考虑,我们又不得不找点类似秒杀系统作为我们简历的支撑项目(即使已经烂大街)。那么先问你第一个问题,为什么就采用了分布式的方案落地这个项目?
当一个人或者几十个使用你的系统,哎呀我去,请求秒回,效果倍棒,于是乎简历砰砰写上却多么牛X,当面试官就会问你你这项目做了啥,测试过没,并发量如何,性能如何?你就…..
当访问系统的用户越来越多,可是我们的系统资源有限,所以需要更多的 CPU 和内存去处理用户的计算请求,当然也就要求更大的网络带宽去处理数据的传输,也需要更多的磁盘空间存储数据。
资源不够,消耗过度,服务器崩溃,系统也就不干活了,那么在这样的情况怎么处理?
-
垂直伸缩
纵向生长。通过提升单台服务器的计算处理能力来抵抗更大的请求访问量。比如使用更快频率的CPU,更快的网卡,塞更多的磁盘等。
其实这样的处理方式在电信,银行等企业比较常见,让摩托车变为小汽车,更强大的计算机,处理能力也就越强,但是对于运维而言也就越来越复杂。那真的就这样花钱买设备就完事了?
当然不,单台服务器的计算处理能力是有限的,而且也会严重受到计算机硬件水平的制约。
-
水平伸缩
一台机器处理不过来,我就用多台廉价的机器合并同时处理,人多力量大嘛,通过多台服务器构成分布式集群从而提升系统的整体处理能力。这里说到了分布式,那我们看看分布式的成长过程
记住一句话:系统的技术架构是需求所驱动
最初的单体系统,只需要部分用户访问:
单体结构
做系统的原因当然是有需求,有价值,可赚钱。随着使用系统的用户越来越多,这时候关注的人越来越多,单台服务器扛不住了,关注的人觉得响应真慢,没啥意思,就开始吐槽,但是这一吐槽,导致用户更多,毕竟大家都爱吃瓜。
这样下去不得不进行系统的升级,将数据库和应用分离。
数据库应用分离
这样子,咋们将数据库和应用程序分离后,部署在不同的服务器中,从1台服务器变为多台服务器,处理响应更快,内容也够干,访问的用户呈指数增长,这多台服务器都有点扛不住了,怎么办?
加一个缓存吧,我们不每次从数据库中读取数据,而将应用程序需要的数据暂存在缓冲中。缓存呢,又分为本地缓存和分布式的缓存。分布式缓存,顾名思义,使用多台服务器构成集群,存储更多的数据并提供缓存服务,从而提升缓存的能力。
加了缓存哪些好处?
-
应用程序不再直接访问数据库,提升访问效率。因为缓存内容在内存中,不用每次连接存放磁盘中的数据库。
系统越来越火,于是考虑将应用服务器也作为集群。
集群
缓存架构
干啥啥不行,缓存第一名。不吹牛,缓存应用在计算机的各个角落。缓存可说是软件技术中的的杀手锏,无论是程序代码使用buffer,还是网络架构中使用缓存,虚拟机也会使用大量的缓存。
其实最初在CPU中也就开始使用缓存。缓存分为两种,一种是通读缓存,一种是旁路缓存
-
通读缓存
假设当前应用程序获取数据,如果数据存在于通读缓存中就直接返回。如果不存在于通读缓存,那么就访问数据源,同时将数据存放于缓存中。
下次访问就直接从缓存直接获取。比较常见的为CDN和反向代理。
通读缓存
CDN
CDN称为内容分发网络。想象我们京东购物的时候,假设我们在成都,如果买的东西在成都仓库有就直接给我们寄送过来,可能半天就到了,用户体验也非常好,就不用从北京再寄过来。
同样的道理,用户就可以近距离获得自己需要的数据,既提高了响应速度,又节约了网络带宽和服务器资源。
-
旁路缓存
应用程序需要自己从数据源读取数据,然后将这个数据写入到旁路缓存中。这样,下次应用程序需要数据的时候,就可以通过旁路缓存直接获得数据了。
旁路缓存
缓存的好处
-
因为大部分缓存的数据存储在内存中,相比于硬盘或者从网络中获取效率更高,响应时间更快,性能更好;
-
通过 CDN 等通读缓存可以降低服务器的负载能力;
-
因为缓存通常会记录计算结果。如果缓存命中直接返回,否则需要进行大量的运算。所以使用缓存也减少了CPU 的计算小号,加快处理速度。
缓存缺点
我们缓存的数据来自源数据,如果源数据被修改了,俺么缓存数据很肯能也是被修改过的,成为脏数据,所以怎么办?
-
过期失效
在每次写入缓存数据的时候标记失效时间,读取数据的时候检查数据是否失效,如果失效了就重新从数据源获取数据。
-
失效通知
应用程序在更新数据源的时候,通知清除缓存中的数据。
是不是数据使用缓存都有意义呢?
非也,通常放入缓存中的数据都是带有热点的数据,比如当日热卖商品,或者热门吃瓜新闻,这样将数据存放在缓存中,会被多次读取,从而缓存的命中率也会比较高。
异步架构
在前面中,通过缓存实际上很多时候是解决了读的问题,加快了读取数据的能力。因为缓存通常很难保证数据的持久性和一致性,所以我们通常不会将数据直接写入缓存中,而是写入 RDBMAS 等数据中,那如何提升系统的写操作性能呢?
此时假设两个系统分别为A,B,其中A系统依赖B系统,两者通信采用远程调用的方式,此时如果B系统出故障,很可能引起A系统出故障。
从而不得不单独进行升级,怎么办?
使用消息队列的异步架构,也成为事件驱动模型。
异步相对于同步而言,同步通常是当应用程序调用服务的时候,不得不阻塞等待服务期完成,此时CPU空闲比较浪费,直到返回服务结果后才会继续执行。
同步
举个例子,小蓝今天想在系统中加一个发邮件的功能,通过SMTP和远程服务器通信,但是远程服务器有很多邮件需要等待发送呢,当前邮件就可能等待比较长时间才能发送成功,发送成功后反馈与应用程序。
这个过程中,远程服务器发送邮件的时候,应用程序就阻塞,准确的说是执行应用程序的线程阻塞。