本文转载自微信公众号《Java攻略》,作者攻略哥。转载本文请联系JavaGuide公众号。系统设计一定是面试官在面试时最头疼的事情之一。因为与系统设计相关的问题通常是开放式的,没有标准答案。你会在与面试官的思想交流和碰撞中逐步优化自己的系统设计方案。从理论上讲,系统设计面试也是与面试官一步步完善原有系统设计的过程。系统设计题往往能考验面试官的综合能力。如果你回答得好,你很容易在面试中脱颖而出。不管是参加社招还是校招的小伙伴,都需要注意一下。接下来我就带着小伙伴们从我的角度谈谈:如何准备面试的系统设计部分。由于文章篇幅有限,就不一一列举实际的例子,一些具体的例子可能会在后面的文章中单独提到。个人能力有限。如果文中有什么需要改进和完善的地方,欢迎在评论区指出,共同进步!您通常如何询问系统设计面试?我简单总结一下系统设计面试的问题:设计某个系统,比如秒杀系统,微博系统,抢红包系统,短网址系统。在XX系统中设计一个功能,比如哔哩哔哩的点赞功能。设计一个框架如RPC框架,消息队列,缓存框架,分布式文件系统等。某个系统的技术选型,如做缓存的Redis或Memcached,做网关的SpringCloudGateway或NetflixZuul2。如何进行系统设计?我们将这些步骤总结为以下4个步骤。Step1:问清楚系统的具体要求当面试官给出系统设计问题时,一定不要马上开始设计解决方案。首先需要了解系统设计的需求:功能需求和非功能需求。为了避免误解你要解决的问题,你可以向面试官简单说明你的理解。为什么要问清楚系统的功能需求,即系统包含哪些功能?毕竟,如果面试官突然让你设计一个微博系统。你不可能把微博系统涵盖的所有功能,比如推荐信息流、会员机制等等,都罗列出来,然后去设计!需要过滤掉系统提供的核心Function(缩小边界范围)!为什么要问系统的非功能需求或约束,比如系统需要达到多少QPS?让你设计10000人的微博系统和100000人的微博系统。它们相同吗?不同的约束系统对应不同的系统设计方案。Step2:系统的抽象设计我们需要在HighLevel层次上设计系统。可以画出系统的抽象架构图,包括系统的一些组件以及这些组件之间的联系。Step3:考虑系统目前需要优化的地方。在对系统的设计进行抽象之后,需要思考当前抽象系统设计中需要优化的点。比如:当前系统部署在一台机器上够不够?是否需要部署在多台机器上?机器负载均衡怎么样?数据库处理速度能否支撑业务需求?指定字段是否需要加索引?读写分离有必要吗?有必要缓存吗?系统是否需要分布式文件系统?......Step4:优化你的系统抽象设计根据Step3“系统需要优化的要点”进一步完善系统抽象设计。如何准备系统设计?知识储备系统设计面试非常考验你的知识储备。系统设计能力的提升需要大量的理论知识储备。例如,你需要知道大型网站架构设计必备的三个工具:高性能架构设计:熟悉系统常用的性能优化方法,如引入读写分离、缓存、负载均衡、异步、等高可用架构设计:CAP理论和BASE理论,通过集群、超时和重试机制提高系统整体稳定性,处理接口级故障:降级、熔断、限流、排队。高度可扩展的架构设计:说白了就是知道如何拆分系统。如果按照不同的思路拆分软件系统,就会得到不同的架构。理论在实战中虽然懂了,但是如果不自己去实践,很多东西是理解不了的!所以一定要通过实战项目不断锻炼自己的系统设计能力。保持好奇心,想一想您经常浏览的网站的表现如何。比如:你在浏览微博的时候,可以想想微博是怎么记录点赞数的?大家在看哔哩哔哩的时候,可以想想消息提醒系统是怎么工作的?大家在使用短链系统的时候可以想想,短链系统是怎么工作的呢?......实现相同功能的技术选择,一般有多种技术选择,比如做缓存的是Redis或者Memcached,做网关的是SpringCloudGateway或者NetflixZuul2。很多时候,面试官会在系统设计过程中具体的选择技术。因此,您需要区分不同技术的优缺点。系统设计面试要知道,系统设计一定离不开QPS等性能相关指标的描述。性能相关指标响应时间响应时间RT(Response-time)是从用户发出请求到用户收到系统处理结果所需的时间。RT是一个非常重要和直观的指标。RT的值直接反映了系统处理用户请求的速度。并发数并发数可以简单理解为系统可以同时访问和使用多少人,即系统可以同时处理的请求数。并发数反映了系统的负载能力。QPS和TPSQPS(QueryPerSecond):服务器每秒可以执行的查询数;TPS(TransactionPerSecond):服务器每秒处理的事务数(这里的事务可以理解为客户端向接收服务器发送请求的过程);书中是这样描述QPS和TPS的区别的。QPSvsTPS:QPS和TPS基本类似,不同的是访问一个页面就形成一个TPS;但是一个页面请求可能会向服务器产生多个请求,服务器可以将这些请求计入“QPS”。比如访问一个页面会请求服务器2次,一次访问会产生一个“T”和两个“Q”。吞吐量吞吐量是指系统在单位时间内处理的请求数。系统的吞吐量与请求对系统的资源消耗密切相关。请求消耗系统资源越多,系统吞吐量越低,反之亦然。TPS和QPS是常见的吞吐量量化指标。QPS(TPS)=并发数/平均响应时间(RT)并发数=QPS*平均响应时间(RT)系统活动介绍几个描述系统活动的常用术语,建议牢记。你不仅会在回答系统设计面试问题时遇到这些术语,在日常工作中也会遇到这些术语。PV(PageView)访问量,即页面浏览量或点击量,衡量网站用户访问网页的次数;在一定的统计周期内,用户每打开或刷新一个页面,就记录一次,如果同一个页面被多次打开或刷新,则为累计浏览量。UV是从网页打开次数/刷新次数的角度来统计的。UV(UniqueVisitor)唯一访客,统计1天内访问某个站点的用户数。如果同一访客在1天内多次访问该网站,则仅计为1位独立访客。UV是从个人用户的角度来统计的。DAU(DailyActiveUser)是每日活跃用户数。MAU(monthlyactiveusers)是每月活跃用户数。示例:某网站DAU为1200w,用户日均使用时长为1小时,RT为0.5s。求并发量和QPS。平均并发量=DAU(1200w)*每天平均使用时间(1小时,?0秒)/每天秒数(86400)=1200w/24=50w真实并发量(考虑某段时间用户数对比)Less)=DAU(1200w)*平均每天使用时间(1小时,0秒)/一天的秒数-假设8小时(57600)=1200w/16=75w峰值并发量=平均并发数*6=300wQPS=真实并发/RT=75W/0.5=100w/s后端常用的性能测试工具由于系统设计涉及到系统性能问题,在面试的时候,面试官很可能会问:Howdoyou执行性能测试?推荐4款常用的性能测试工具:Jmeter:ApacheJMeter是JAVA开发的一款性能测试工具。LoadRunner:一种商业性能测试工具。Galtling:基于Scala开发的高性能服务器性能测试工具。ab:全称是ApacheBench。Apache下的一个测试工具,非常好用。如果我没记错的话,除了LoadRunner之外,其他几个性能测试工具都是开源免费的。Fiddler是前端常用的:一个抓包工具,可以修改请求的数据,甚至修改服务器返回的数据。它非常强大,是Web调试的利器。HttpWatch:一个可以用来记录HTTP请求信息的工具。常用软件QPS这里给出的QPS仅供参考,实际项目需要通过压测计算。Nginx:一般情况下,系统的性能瓶颈基本不会是Nginx。单机Nginx可以达到30w+。Redis:Redis官方性能测试报告:https://redis.io/topics/benchmarks。从报告中我们可以得出结论,Redis的单机QPS可以达到8w+(CPU性能有关系,也和执行的命令有关系,比如SET命令的执行甚至可以达到10w+QPS)。MySQL:MySQL单机的QPS在4k左右。Tomcat:单机Tomcat的QPS在2w左右。这与你的Tomcat配置有很大关系。例如,Tomcat支持的连接器有NIO、NIO.2和APR。AprEndpoint通过JNI调用APR原生库实现非阻塞I/O,性能更好。如果Tomcat配置APR为connector,QPS可以达到3w左右。更多相关内容可以自行搜索Tomcat性能优化。系统设计原则合适胜于先进>进化胜于一步完成>简单胜于复杂常见的性能优化策略在性能优化之前,我们需要对请求流程的各个环节进行分析,找出可能存在的性能瓶颈,定位问题.以下是我在优化性能时经常问自己的一些问题:当前系统的SQL语句是否存在问题?当前系统是否需要升级硬件?系统是否需要缓存?是不是系统架构本身有问题?锁在哪里?数据库索引的使用是否合理?系统是否存在内存泄漏?(Java的自动内存回收很方便,但有时候写得不好的代码确实会造成内存泄漏)系统的耗时操作是异步处理的吗?...性能优化必知规则SQL优化、JVM、DB、Tomcat参数调优>硬件性能优化(内存升级、CPU核数增加、机械硬盘->固态硬盘等)>业务逻辑优化/缓存>读写分离、集群等>分库分表系统设计面试注意事项。想了想说没必要。面试官刚问完问题,你还没准备好就开始回答了。这样不会给面试官留下好印象的!系统设计需要面试官结合以往的经验进行思考,这个过程需要一定的时间。没有绝对答案系统设计没有标准答案。重要的是与面试官沟通的过程。一般情况下,你会在与面试官的交流过程中一步步完成系统设计。在这个过程中,你会在面试官的指导下不断完善自己的系统设计。因此,你不需要在系统设计面试前找一大堆问题,然后简单地记住他们的答案。不要绝对。系统设计没有最好的设计方案,只有最合适的设计方案。这类似于架构设计:软件开发没有灵丹妙药,架构设计的目的是选择合适的解决方案。什么是银弹?根据狼人传说,只有银弹(silverbullets)才能制服这些野兽。对应软件开发活动,银弹特指一个“万能钥匙”。开发人员寻求克服软件开发中的困难野兽。权衡利弊了解使用某项技术可能给您的系统带来的利弊。比如使用消息队列的好处是解耦和调峰,但是也会降低系统可用性,增加复杂度,还有一致性问题(如果消息丢失或者没有被消费怎么办)。慢慢优化系统在设计之初不需要做到完美,可以慢慢优化。不追求新技术使用稳定且对业务友好的技术,没有必要过度追求新技术。追求简单,避免复杂系统设计应该追求简单,避免复杂。KISS(KeepItSimple,Stupid)原则——保持简单易懂。总结这篇文章,我简单的带着小伙伴们分析了一下系统设计面试。如果你还想了解更多,可以参考:https://github.com/donnemartin/system-design-primer。参考https://github.com/donnemartin/system-design-primerhttps://www.acecodeinterview.com/intro/https://gist.github.com/vasanthk/485d1c25737e8e72759f原文链接:https://mp.微信.qq.com/s/1Jl8ee0jJoFdGMfIhl_qaQ
