当前位置: 首页 > 科技观察

如果我们现在要做一个千万级用户的网站,高并发架构怎么设计?

时间:2023-03-21 17:25:05 科技观察

本文转载自微信公众号《Java极客技术》,作者鸭血范。转载本文请联系Java极客技术公众号。以前阿芬一直在看同事的面试,但是阿芬并没有自己去面试,结果无意中打开Boss,发现有公司私聊我。我回复后,她还说可以去面试,我没想过。面试的一个问题让我的薪水瞬间被砍了5K。如果你不想你出去要的工资被砍掉,那你就得设计这个。一般项目结构像阿芬朋友的公司,属于中小型公司。公司的项目都是按照客户要求定制开发的,服务器数量少得可怜。什么是高并发?考虑一下,什么叫高可用,不考虑,把自己的项目部署在一台服务器上,有时候连图片服务器都没有,他们的图片就是这样的。是不是看起来很简单,浏览器客户端直接与单个服务器通信。如果访问量超过一千,比如秒出限量版,那可能直接就凉了,就像“咚”的一声,访问失败了。稍微进阶版的项目架构此时一般的网站架构还是采用单体架构,只是服务器数量相对增加了。最后增加了数据库服务器和应用服务器,增加了图片服务器,构成了一个小小的进步。项目架构的版本。也就是说,我们在部署应用的时候,手动关闭应用服务器上的Tomcat,然后更换系统代码war包,然后重启Tomcat。此时将数据单独部署在另一台服务器上,用于存放网站的所有核心数据。然后在另一台独立的服务器上部署NFS作为图片服务器,存放网站的所有图片。此时代码执行请求,数据访问在另一台服务器上,图片在另一台服务器上,这样加服务器部署的普通版项目架构就完成了,大部分项目就这样了像这样,毕竟小公司人手有限。简单支持高并发、高可用的项目架构。不知道面试的时候你说这话的时候面试官有没有问你。如果你的应用服务器挂了,你是怎么处理的?是的,应用服务器真的会出事,那么当项目的应用服务器真的出事之后,我们怎么处理呢?如果你换了服务器,那么你要对应的很多配置都要改,需要改很多东西,那么维护的时间就会很长,维护成本非常高.这时候,我们有这样的:如果我们的一个应用服务器宕机不工作,那么另一个服务器会正??常使用,而且,同时使用的时候,我们也有可能分发大量的来自浏览器的请求,直接拆分成两部分。如果其中一个服务器配置是“高飞”,那么我们也可以通过配置,给他请求,让他多一点,“设置权重”,让他分担更多的压力,而如果服务器相对low,相应的请求会减少一点,毕竟性能比较低。这时候又会出现一个意外,就是数据库服务器宕机了,怎么办?同样的原理,再增加一个数据库服务器,即主从数据库。那么为什么要做主从复制,不仅是因为服务器宕机的问题,而且如果数据库的读写都在同一个数据库服务器中进行,那么业务系统的性能会有所下降。而我们很多项目需要比较重要的数据,很多都是做读写分离的。为了提高业务系统的性能,优化用户体验,我们可以通过做主从复制(读写分离)来降低主库的负载。一个用于写数据,一个用于同步master的数据,用于数据查询操作。配置主从复制后,同一张表只能写到一台服务器上。业务分离现在很多项目的结构是大家的业务代码写在一起,很乱。几个人的代码,维护的时候叫崩溃。当你看到这样的项目时,你会发现,人都傻了,这是什么鬼?如果你改变一点点,其他的就不行了。这就是所谓的崩溃。这个时候,我们就需要彻底划分业务。比如商城,订单属于一个业务,积分属于一个业务,物流属于另一部分业务。这时候,我们需要分成三个业务模块。也就是说,每一条内容都属于一个服务,这些服务的叠加不是1+1=2的问题。当这些业务服务加在一起的时候,整个项目和你写的所有内容都是一样的。一个部分的内容差距很大,尤其是在代码冗余方面,还是比较透彻的。而说到这些内容,也差不多了,但是阿芬真的不知道那么多,阿芬也没想过你之前面试的时候会问到这些内容。可能阿芬当时只想自己做咸鱼,不关心架构,这确实是很多公司看重的东西。在这里,阿芬再次为大家贡献了本次采访的其他问题,并给出了详细的解答,阿芬也很欣慰,只是压下了薪水,并没有说直接拒绝。一、Redis分区实现方案客户端分区:客户端分区是指客户端已经决定好将数据存入或读取到哪个redis节点。大多数客户端已经实现了客户端分区。代理分区:代理分区是指客户端将请求发送给代理,然后由代理决定向哪个节点写入或读取数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis响应返回给客户端。查询路由:查询路由是指客户端随机请求任意一个redis实例,然后Redis将请求转发给正确的Redis节点。RedisCluster实现了一种混合形式的查询路由,但不是直接将请求从一个redis节点转发到另一个,而是借助客户端直接重定向到正确的redis节点。这些都是阿芬死记硬背的。对于这种东西,没有真正亲自实践过的,没有遇到问题的,都是diss,但是面试官好像理解的不是很深。我知道,但我没有仔细研究我的内容。2.SpringBean的生命周期说实话,这个问题现在好像是面试必问的知识点,阿芬的同事面试也会被问到,不过巧的是,之前阿芬写过SpringBean的生命周期.文章链接发给大家,大家可以仔细查看,一起交流。面试官:大哥,能解释一下Spring框架中bean的生命周期吗?所以大家一定要准备这个,SpringBean从初始化到最后销毁的生命周期是怎样的,流程是怎样的,流程怎么理解。3、我在回答HashMap和Hashtable的问题时,把它们分开了,分类比较。比如:线程安全性能的优缺点、NULL的实现方式、扩容等。我分为五个部分来回答。三四个也不错,至少比你只能说线程安全和key是否允许为空好太多了。有兴趣的请找合集系列文章,在过往历史中找找看。关于HashMap和Hashtable的面试点很多。4、JVM内存模型和优化相信只要工作过两三年的程序员肯定都知道,我给大家简单说一下。之前的文章图解等问题不算经典,属于项目业务,阿粉就不一一介绍了。总结起来,基础一定要掌握,扩展一定要知道。不然面试的时候想拿高薪?毕竟那是不可能的。不是每个公司都缺“大师”吧?阿芬在这里希望大家都能找到自己理想的工作,等疫情稳定后,可以直接跳槽,工资“双倍”。