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!
 










