首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
在考古的菜鸡很热情
门头沟学院 测试工程师
发布于陕西
关注
已关注
取消关注
@Java架构师-桃子:
【面试必看】系统设计面试该如何回答?
系统设计在面试中一定是最让面试者头疼的事情之一。 因为系统设计相关的问题通常是开放式的,所以没有标准答案。你在和面试官思想的交流碰撞中会慢慢优化自己的系统设计方案。理论上来说,系统设计面试也是和面试官一起一步一步改进原有系统设计方案的过程。 系统设计题往往也非常能考察出面试者的综合能力,回答好的话,很容易就能在面试中脱颖而出。不论是对于参加社招还是校招的小伙伴,都很有必要重视起来。 接下来,我会带着小伙伴们从我的角度出发来谈谈:如何准备面试中的系统设计部分。 由于文章篇幅有限,就不列举实际例子了,可能会在后面的文章中单独提一些具体的例子。 个人能力有限。如果文章有任何需要改善和完善的地方,欢迎在评论区指出,共同进步! 我也给大家整理了一份Java核心知识点+面试真题大全,需要的可以点击领取 系统设计面试一般怎么问? 我简单总结了一下系统设计面试相关问题的问法: 设计一个某某系统比如秒杀系统、微博系统、抢红包系统、短网址系统。 设计某某系统中的一个功能比如哔哩哔哩的点赞功能。 设计一个框架比如 RPC 框架、消息队列、缓存框架、分布式文件系统等等。 某某系统的技术选型比如缓存用Redis 还是Memcached、网关用Spring Cloud Gateway 还是Netflix Zuul2 。 系统设计怎么做? 我们将步骤总结成了以下 4 步。 Step1:问清楚系统具体要求 当面试官给出了系统设计题目之后,一定不要立即开始设计解决方案。 你需要先理解系统设计的需求:功能性需求和非功能性需求。 为了避免自己曲解题目所想要解决的问题,你可以先简要地给面试官说说自己的理解, 为啥要询问清楚系统的功能性需求也就是说系统包含哪些功能呢? 毕竟,如果面试官冷不丁地直接让你设计一个微博系统,你不可能把微博系统涵盖的功能比如推荐信息流、会员机制等一个一个都列举出来,然后再去设计吧!你需要筛选出系统所提供的核心功能(缩小边界范围)! 为啥要询问清楚系统的非功能性需求或者说约束条件比如系统需要达到多少QPS呢? 让你设计一个1w人用的微博系统和100w人用的微博系统能一样么?不同的约束系统对应的系统设计方案肯定是不一样的。 Step2:对系统进行抽象设计 我们需要在一个 High Level 的层面对系统进行设计。 你可以画出系统的抽象架构图,这个抽象架构图中包含了系统的一些组件以及这些组件之间的连接。 Step3:考虑系统目前需要优化的点 对系统进行抽象设计之后,你需要思考当前抽象的系统设计有哪些需要优化的点,比如说: 当前系统部署在一台机器够吗?是否需要部署在多台机器然后进行负载均衡呢? 数据库处理速度能否支撑业务需求?是否需要给指定字段加索引?是否需要读写分离?是否需要缓存? 数据量是否大到需要分库分表? 是否存在安全隐患? 系统是否需要分布式文件系统? … Step4:优化你的系统抽象设计 根据 Step 3 中的“系统需要优化的点” 对系统的抽象设计做进一步完善。 系统设计该如何准备? 知识储备 系统设计面试非常考察你的知识储备,系统设计能力的提高需要大量的理论知识储备。比如说你要知道大型网站架构设计必备的三板斧: 1.高性能架构设计: 熟悉系统常见性能优化手段比如引入 读写分离、缓存、负载均衡、异步等等。 2.高可用架构设计 :CAP理论和BASE理论、通过集群来提高系统整体稳定性、超时和重试机制、应对接口级故障:降级、熔断、限流、排队。 3. 高扩展架构设计 :说白了就是懂得如何拆分系统。你按照不同的思路来拆分软件系统,就会得到不同的架构。 实战 虽然懂得了理论,但是自己没有进行实践的话,很多东西是无法体会到的! 因此,你还要不断通过实战项目锻炼自己的系统设计能力。 保持好奇心 多思考自己经常浏览的网站是怎么做的。比如: 你刷微博的时候可以思考一下微博是如何记录点赞数量的? 你看哔哩哔哩的时候可以思考一下消息提醒系统是如何做的? 你使用短链系统的时候可以考虑一下短链系统是如何做的? … 技术选型 实现同样的功能,一般会有多种技术选择方案,比如缓存用Redis 还是Memcached、网关用 Spring Cloud Gateway还是Netflix Zuul2 。 很多时候,面试官在系统设计面过程中会具体到技术的选型,因而,你需要区分不同技术的优缺点。 系统设计面试必知 系统设计的时候必然离不开描述性能相关的指标比如 QPS。 性能相关的指标 响应时间 响应时间RT(Response-time)就是用户发出请求到用户收到系统处理结果所需要的时间。 RT是一个非常重要且直观的指标,RT数值大小直接反应了系统处理用户请求速度的快慢。 并发数 并发数可以简单理解为系统能够同时供多少人访问使用也就是说系统同时能处理的请求数量。 并发数反应了系统的负载能力。 QPS 和 TPS QPS(Query Per Second) :服务器每秒可以执行的查询次数; TPS(Transaction Per Second) :服务器每秒处理的事务数(这里的一个事务可以理解为客户发出请求到收到服务器的过程); 书中是这样描述 QPS 和 TPS 的区别的。 QPS vs TPS:QPS 基本类似于 TPS,但是不同的是,对于一个页面的一次访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“QPS”之中。如,访问一个页面会请求服务器2次,一次访问,产生一个“T”,产生2个“Q”。 吞吐量 吞吐量指的是系统单位时间内系统处理的请求数量。 一个系统的吞吐量与请求对系统的资源消耗等紧密关联。请求对系统资源消耗越多,系统吞吐能力越低,反之则越高。 TPS、 QPS都是吞吐量的常用量化指标。 QPS(TPS) = 并发数/平均响应时间(RT) 并发数 = QPS * 平均响应时间(RT) 系统活跃度 介绍几个描述系统活跃度的常见名词,建议牢牢记住。你不光会在回答系统设计面试题的时候碰到,日常工作中你也会经常碰到这些名词。 PV(Page View) 访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量;在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计。UV 从网页打开的数量/刷新的次数的角度来统计的。 UV(Unique Visitor) 独立访客,统计1天内访问某站点的用户数。1天内相同访客多次访问网站,只计算为1个独立访客。UV 是从用户个体的角度来统计的。 DAU(Daily Active User) 日活跃用户数量。 MAU(monthly active users) 月活跃用户人数。 举例:某网站 DAU为 1200w, 用户日均使用时长 1 小时,RT为0.5s,求并发量和QPS。 平均并发量 = DAU(1200w)* 日均使用时长(1 小时,3600秒) /一天的秒数(86400)=1200w/24 = 50w 真实并发量(考虑到某些时间段使用人数比较少) = DAU(1200w)* 日均使用时长(1 小时,3600秒) /一天的秒数-访问量比较小的时间段假设为8小时(57600)=1200w/16 = 75w 峰值并发量 = 平均并发量 * 6 = 300w QPS = 真实并发量/RT = 75W/0.5=100w/s 常用性能测试工具 后端常用 既然系统设计涉及到系统性能方面的问题,那在面试的时候,面试官就很可能会问:你是如何进行性能测试的? 推荐 4 个比较常用的性能测试工具: Jmeter:Apache JMeter 是 JAVA 开发的性能测试工具。 LoadRunner:一款商业的性能测试工具。 Galtling:一款基于Scala 开发的高性能服务器性能测试工具。 ab:全称为 Apache Bench 。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 为 连接器的话,QPS 可以达到 3w左右。更多相关内容可以自行搜索 Tomcat 性能优化。 系统设计原则 合适优于先进 > 演化优于一步到位 > 简单优于复杂 常见的性能优化策略 性能优化之前我们需要对请求经历的各个环节进行分析,排查出可能出现性能瓶颈的地方,定位问题。 下面是一些性能优化时,我经常拿来自问的一些问题: 当前系统的SQL语句是否存在问题? 当前系统是否需要升级硬件? 系统是否需要缓存? 系统架构本身是不是就有问题? 系统是否存在死锁的地方? 数据库索引使用是否合理? 系统是否存在内存泄漏?(Java 的自动回收内存虽然很方便,但是,有时候代码写的不好真的会造成内存泄漏) 系统的耗时操作进行了异步处理? …… 性能优化必知法则 SQL优化,JVM、DB,Tomcat参数调优 > 硬件性能优化(内存升级、CPU核心数增加、机械硬盘—>固态硬盘等等)> 业务逻辑优化/缓存 > 读写分离、集群等 > 分库分表 系统设计面试的注意事项 1.想好再说 没必要面试官刚问了问题之后,你没准备好就开始回答。这样不会给面试官带来好印象的!系统设计本就需要面试者结合自己的以往的经验进行思考,这个过程是需要花费一些时间的。 2.没有绝对的答案 系统设计没有标准答案。重要的是你和面试官一起交流的过程。 一般情况下,你会在和面试官的交流过程中,一步一步完成系统设计。这个过程中,你会在面试官的引导下不断完善自己的系统设计方案。 因此,你不必要在系统设计面试之前找很多题目,然后只是单纯记住他们的答案。 3.勿要绝对 系统设计没有最好的设计方案,只有最合适的设计方案。这就类比架构设计了:软件开发没有银弹,架构设计的目的就是选择合适的解决方案。 何为银弹? 狼人传说中,只有银弹(银质子弹)才能制服这些猛兽。对应到软件开发活动中,银弹特指开发者们寻求的一种克服软件开发这个难缠的猛兽的“***🔑”。 4.权衡利弊 知道使用某个技术可能会为系统带来的利弊。比如使用消息队列的好处是解耦和削峰,但是,同样也让系统可用性降低、复杂性提高,同时还会存在一致性问题(消息丢失或者消息未被消费咋办)。 5.慢慢优化 刚开始设计的系统不需要太完美,可以慢慢优化。 6.不追新技术 使用稳定的、适合业务的技术,不必要过于追求新技术。 7.追简避杂 系统设计应当追求简单避免复杂。KISS( Keep It Simple, Stupid)原则——保持简单,易于理解。
点赞 2
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
01-05 15:28
已编辑
科大讯飞_教育BG_后端开发(准入职员工)
简历制作分享经验
首先要明确简历的核心要义 ——“简”。一份简历的篇幅控制在一到两页为佳,尤其需要注意的是,第一页是重中之重,必须优先呈现个人基本信息,同时提炼并突出自身的核心优势,让招聘方快速捕捉到你的亮点。然后推荐使用简历模板——全民简历简历亮点如下:学历(重点大学)实习经历(写实习内容的时候,需要量化的指标信息)可以维护一些个人总结,比如CSDN博客、飞书等可以证明自己确实学过的路程。项目(量化)个人简历分享如下:#有深度的简历长什么样?#
有深度的简历长什么样?
点赞
评论
收藏
分享
01-04 16:50
科大讯飞_研发算法_计算机视觉算法工程师(准入职员工)
云智研发内推,云智研发内推码
📝 面试经历: 面试官都很友好,说是面试但更像是在交流所学和应用在项目中的知识技能,不拘泥于八股文更偏向实际应用一些,能和小组组长和总监直接交流也是一份有价值的经历。 🌟 工作氛围: 工作氛围很好同事交流起来都很轻松和谐,大佬都很谦逊问很基础的问题也耐心解答,工作强度有但不算很高,平时也有很多时间去做自己感兴趣的事,能实现work life balance~ 🌱 新人融入提升: ◎新人有充足的时间学习实际项目中的操作内容,有不懂的问题可以向导师、同事提问,大家都乐于帮忙解惑; ◎丰富的腾讯iwiki资料和众多内部录屏资料能帮助新人快速了解和上手项目,在文档中找到项目或工具负责人后可以在企...
腾讯成长空间 6021人发布
点赞
评论
收藏
分享
2025-12-15 14:16
门头沟学院 Java
28届沟通1000+了
找不到到,根本找不到😭😭😭😭😭 ,没办法,只能伪装27了😿
回家当保安:
发offer的时候会背调学信网,最好不要这样
。 “27届 ”和“28届以下 ”公司招聘的预期是不一样的。
实习简历求拷打
点赞
评论
收藏
分享
2025-12-21 22:01
中国电信新疆公司_云网部_网络工程师
我向大厂祈祷,回应我的却只有圣杯...
收到大厂的邀请了,不过...是圣杯的因为小可爱公司把我的宿舍拆了,现在住3人一间的员工宿舍,婉拒了价值千元的高品质圣杯本人也算是个国内国外的双面小博主,游戏小高手,小有名气的steam游戏鉴赏家,频道较为垂直,不过因为找不到IT工作每天都活在无尽的内耗和写自己的项目上面没怎么发视频,是该继续准备春招还是换一条赛道呢。
点赞
评论
收藏
分享
01-06 18:32
思特威电子科技_嵌入式工程师(准入职员工)
思特威内推,思特威内推码
思特威 嵌入式Linux 笔试+一面8.17投递 岗位叫BSP工程师-SOC方向8.30笔试:一共九道题,有八股文简答题,有编程题和逻辑题。八股文包括:指针各种定义,进程线程,死锁,volatile;编程:冒泡,判断素数,指定位置翻转链表;逻辑题:经典的真话假话判断。后续,邮件通知笔试通过,进入面试,一面9.4:1. 自我介绍2. static关键字(存的地方搞错了,说了跟全局一样但是记不清了,有扯皮全局变量存在data、bss段)3. Linux用过吗4. 锁的应用5. 内存分配函数,kmalloc和vmalloc,地址连续吗(vmalloc大内存分配,虚拟地址连续,比较慢,同样不初始化)(...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
双非非科班2年时间的转码历程
7945
2
...
入职第一天:允许自己像个新生
7758
3
...
百度java一面 28届的第一次大厂面试 感觉g了
4076
4
...
师门闯关记①:好学姐我听你的,就选你说的那个导师了
3782
5
...
拥抱人机共生,锻造不可替代的“金头脑”
3438
6
...
嵌入式学习路线分享
2949
7
...
实习不忙被公司要求下周再来
2854
8
...
双非老鼠的悲惨秋招
2852
9
...
测开劝退
2732
10
...
“CRUD”正在消亡吗,2026该何去何从
2701
创作者周榜
更多
正在热议
更多
#
26年哪些行业会变好/更差
#
10853次浏览
148人参与
#
卷__卷不过你们,只能卷__了
#
4416次浏览
106人参与
#
去年的flag与今年的小目标
#
5304次浏览
136人参与
#
哪些公司在招寒假实习?
#
5287次浏览
55人参与
#
有深度的简历长什么样?
#
10715次浏览
208人参与
#
入职第一天
#
6568次浏览
133人参与
#
你都用AI做什么
#
4037次浏览
102人参与
#
写论文的崩溃时刻
#
2425次浏览
63人参与
#
你不能接受的企业文化有哪些
#
5654次浏览
96人参与
#
一人分享一道面试手撕题
#
14070次浏览
622人参与
#
央国企投递记录
#
169903次浏览
1632人参与
#
应届生应该先就业还是先择业
#
162516次浏览
825人参与
#
腾讯音乐求职进展汇总
#
146776次浏览
1041人参与
#
非技术投递记录
#
678257次浏览
6832人参与
#
实习,不懂就问
#
148087次浏览
1329人参与
#
vivo求职进展汇总
#
263579次浏览
1534人参与
#
CVTE求职进展汇总
#
29123次浏览
334人参与
#
毕业论文怎么查AI率
#
71038次浏览
1945人参与
#
应届生初入职场,求建议
#
288735次浏览
2854人参与
#
24秋招避雷总结
#
909964次浏览
7014人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务