为什么考察系统设计类题目
系统设计题是高级工程师面试过程中必不可少的一类题目。这类题目经常能够真正考察面试者的真实综合实力,能够反映面试者的知识广度和深度。
这类题目往往面试官提供的信息非常少,需要面试者自己去思考系统功能、系统难点、设计方案,还要在设计过程中经受面试官的层层盘问和质疑。
然而,这和算法面试和程序面试不同的是,这类题目往往没有标准答案,主要看中的是你思考论述的过程,而不是你最后提出的解决方案(当然如果你提出的解决方案实在太挫……)。
也就是说,系统设计面试最重要的一点是“沟通”(communication)。
我们不会要求工程师一下子就开发出非常完美的功能。相反地,我们的工程师对于这些开放性问题有着充分的自主权。而且,我们的工作就是各自去为这些问题提出最佳的解决方案我们希望寻找的是那些我们可以完全信任的人。这样,他们自己就可以做出非常棒的方案,而不需要我们的监管。也就是说,我们需要的工程师,是那些可以管理一个很大项目,同时保持项目持续朝正确方向发展的人。这意味着,你必须可以高效地与身边的同时进行沟通。因为“闭门造车”在我们的大规模项目中是不可能的。
面试官考察点梳理
沟通能力
- 通过有效提问,了解业务功能和设计要点。
技术能力
- 全局设计能力和难题解决能力
应变能力
- 有效回答面试官的提问和质疑,通过不断的博弈,对方案进行改进和优化。
知识水平
- 需要掌握常用的开源软件,挑选最合适的来使用,并能有效对比各自的优缺点和使用场景。
答题套路
一、明确问题
拿到了问题之后,切记张口就来,我们只有一个大概的方向,即我们要做一个什么。但是并不清楚具体条件,而不同的的业务场景所需要的架构也是不一样的。
第一步我们需要先问几个问题:
- 复述一下系统核心功能点和面试官对齐,看看自己的设想和面试官系统要求点是否一致(遇到自己没接触过过的系统时尤为必要)
- 这个系统一天的请求量是多少?
- 峰值QPS是多少
总结:
1、明确功能点
2、明确基本数据二、模块划分
一个完整的系统往往包含多个组成部分,每个部分完成独立的工作,最后通过相互交互达成数据流转。
这一步我们要完成几点设计:
1、模块划分,每个模块需要完成的功能点,读写分离、动静分离、缓存读、异步写等等?
2、模块之间的数据交互,HTTP or RPC or MQ?三、存储设计
这一步是涉及的关键,需要对常见存储工具都有一个清晰的认识,包括优缺点对比、适用场景。
存储硬件性能对比:
| 存储设备 | 吞吐量 | 响应时间 |
|---|---|---|
| L1 | Cache | 0.5ns |
| L2 | Cache | 7ns |
| 内存 | 800M/s | 100ns |
| SSD | 300M/s | 0.1~0.2ms |
| 机械硬盘 | 300M/s | 10ms,其中寻道时间在9ms左右 |
常见性能数据
Nginx:能轻松的处理c100k问题,内存越大,能处理的并发量越高
Redis: https://redis.io/topics/benchmarks 表明,对于GET/SET来说,QPS 10-100k没啥大问题
MySQL: https://www.mysql.com/why-mysql/benchmarks/ 表明,对于只读,QPS 几百k没啥问题,对于写,MySQL 5.7 QPS 100k 几乎是上限, TPS基本上10K级别
存储软件对比分析:
| 存储软件 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| MySQL | 支持事务,JOIN | 大数据量扩容困难,字段频繁变更操作麻烦 | 事务需求,多表JOIN |
| Redis | 高性能读写 | 内存昂贵,存储容量小 | 缓存 |
| MongoDB | 文档型,字段变更灵活,扩容简单 | 不支持事务、JOIN | 字段不确定,变更频繁,性能和MySQL相差无几 |
| Hbase | 支持海量数据的存储 | 读写性能相对差一些 | 适用海量数据的存储分析,多版本,数据稀疏 |
| ES | 支持多维度查询,高可用 | ES没有事务也不适合处理并行更改数据 | 适用于检索,全文检索 |

设计要点梳理
核心要点:三高(高并发、高可用、高扩展) + 故障监控
一. 高并发
1.1 负载均衡引流,分布式部署
四层负载均衡(F5)配合7层负载均衡(nginx,proxy)
四层性能高,七层更智能。1.2 动静分离
借助CDN,减轻服务器压力1.3 MQ削峰填谷
kafka、rabbitMq、RocketMq等1.4 缓存读代替数据库
redis、memcache1.5 乐观锁代替悲观锁
CAS、版本号机制,MVCC二. 一致性
主从一致
数据库与缓存一致
跨机房数据中心一致三. 高可用
集群模式,多副本(Replication)冗余,自主选举切换, 主从切换,主备切换
熔断
降级五. 可扩展
灵活扩容六. 故障检测与恢复
监控
链路追踪