type
status
date
slug
summary
tags
category
icon
password
考察点
- 交流沟通和理解能力:充分交流理解所设计系统的目标,方便做设计中的tradeoff
- 询问系统商业目的,解决什么问题,用户特点
- 功能性需求 and 非功能性需求
- 跟着面试官思路走就好了
- 资源估算:达到我们所要求的QPS和latency,需要多少资源
- 理解系统瓶颈
- 计算流量、存储
- 计算机器规模
- 设计和架构能力:核心部分
- 架构图
- 数据结构与存储
- 核心子服务设计,支持scale
- 接口设计
- 专题深挖(optional)
- 扩展性 (Scalability),容错性,延迟要求
- 一般在第二轮设计才考虑,优先满足设计和架构
- 还需要考虑日志、监控、报警、容灾
(顺序、重点不一定;重点放前面)
要点
思考 > 知识
- 平衡取舍 ⇒ 要有方案和组件的对比,做出合适的选择
- 预判未来 ⇒ 如果未来规模到了xxx/需要加入yyy怎么办?系统瓶颈和风险在哪?
- 抽象思维 ⇒ 宏观上,会画架构图和数据流图;微观上,做好API和数据结构的设计
- 容错能力 ⇒ xxx部分不行了怎么办
- 业界调研 ⇒ 有哪些解决方案可供参考?内部/社区有哪些基础组件?
流程框架
没有最好的架构,只有最合适的架构。
- 明确需求(问清楚了再开始)
- 功能性需求(系统具体功能?)
- 非功能性需求
- 高可用
- 低延迟
- 一致性
- 分区
- 流量模式、特点
- 粗略估计
- 系统规模
- 用户量
- 日活用户DAU
- 段时间内平均QPS
- 存储空间(数据量?文字 or 图片 or 音视频?)
- 网络带宽
- 设计API
- 鉴权
- REST
- 数据模型
- SQL or NoSQL?用什么库?
- 有没有图片、视频需要用到对象存储?
- 数据分区?(垂直、水平)
- 索引?
- 绘制架构
- 负载均衡
- 应用服务器
- cache/filter
- 数据库
- 中间件(mq、分布式锁)
- 对象存储
- 顺着面试官的关注点,深挖两三个组件
- 优缺点
- 选它的原因
- 找出瓶颈,试着解决
- 是否存在单点故障?怎么缓解?
- 数据副本的量够不够?挂掉几台服务器仍然可以为用户提供服务?
- 服务之间的关联性强不强?会不会互相影响?
- 服务的性能怎么监控?怎么报警?
- 如果当前支持100w用户,如何扩展到以支持1000w?
常见问题
- 我们将做哪些具体的功能?它们之间的权重/优先级怎么样?
- 这个产品有多少用户?日活?
- 公司预计以多快的速度扩大规模?3个月、6个月和一年的预期规模是什么?
- 公司的技术栈是什么?
- 做移动端APP/小程序/web?
面试 Tips
- 很可能就是让你设计一个常用的产品X,问题往往十分含糊。要知道,一个人怎么可能在一个小时内设计出一款受欢迎的产品,而这种产品需要数百甚至数千名工程师来完成?显然,没人指望你这么做。现实世界的系统设计极其复杂。
- 系统设计面试,是为了模拟现实生活中解决问题的过程,两位同事就一个模棱两可的问题进行合作,并提出一个满足他们目标的解决方案。这个问题是无止境的,没有完美的答案。与你在设计过程中投入的工作相比,最终的设计并不重要。这可以让你展示你的设计技能,捍卫你的设计选择,并以建设性的方式回应反馈。
- 很多工程师的一个通病,是喜欢过度设计,因为他们喜欢设计的纯粹性,而忽略了trade-off。他们往往没有意识到过度设计系统引入的成本,许多公司为此付出了高昂的代价。不要在系统设计面试中表现出这种倾向。
- 永远不要说你的设计是完美的,没什么可以改进的了!!!总有需要改进的地方的。这是一个展示你批判性思维的好机会,也会给面试官留下好印象。
- 不要假设,不确定就问。
- Author:王帅真
- URL:https://blog.qizong007.top/article/system-design-interview
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!