如何答好面试中的系统设计题?
想要答好系统设计,首先要了解系统设计面试的评分标准。系统设计面试主要考察以下几个方面:
- 可行解 Work Solution 25%
- 特定问题 Special Case 20%
- 分析能力 Analysis 25%
- 权衡 Tradeoff 15%
- 知识储备 Knowledge Base 15%
在面试中,常见的错误是面试官给出问题后,候选人就开始怼各种关键词,什么Load Balancer,Memcache,NodeJS,MongoDB,MySQL……
实际上,针对系统设计问题,九章算法有一套4S分析法,即使完全不知道的问题也可以按照这个方法一步步去回答。
首节直播时间:明天 09:30-11:30,快来戳我免费报名试听吧。
所谓4S分析法中的4S是指Scenario(场景),Service(服务),Storage(存储),Scale(扩展)。
接下来,我们结合4S分析法来具体回答一道常见系统设计题:如何设计一个推特?
第一步:Scenario 场景
在这一步,你需要询问面试官:需要设计哪些功能(也可以自己想),需要承受多大的访问量?
首先可以把Twitter的功能一个个罗列出来,很显然你无法在45分钟的面试中完成所有功能的设计,所以需要筛选出核心功能(Post a Tweet,Timeline,News Feed,Follow/Unfollow a user,Register/Login)。
然后有的面试官可能会问你系统承受的QPS大概是多少?需要考虑并发用户,读频率(Read QPS)以及写频率(Write QPS)。记住重要的是你的思考和计算过程而不是计算结果。
分析QPS有什么用?
- 如果QPS = 100,那么用你的笔记本作Web服务器就好了;
- QPS = 1K,一台好点的Web 服务器也能应付,需要考虑Single Point Failure;
- QPS = 1m,则需要建设一个1000台Web服务器的集群,并且要考虑如何Maintainance(某一台挂了怎么办)。
QPS 和 服务器/数据库之间的关系
- 一台Web Server承受量约为 1K的QPS(考虑到逻辑处理时间以及数据库查询的瓶颈);
- 一台SQL Database承受量约为 1K的QPS(如果JOIN和INDEX query比较多的话,这个值会更小);
- 一台 NoSQL Database (Cassandra) 约承受量是 10k 的 QPS;
- 一台 NoSQL Database (Memcached) 约承受量是 1M 的 QPS。
第二步,Service服务
所谓服务可以认为是逻辑处理的整合,对于同一类问题的逻辑处理可以归并到一个服务中。这一步实际上就是将整个系统细分为若干个小的服务。
根据第一步选出的核心功能,我们可以将推特拆分成如下的几个服务:
第三步,Storage 存储
接下来就是4S分析法中最重要的一部分,存储。根据每个服务的数据特性选择合适的存储结构,然后细化数据表结构。
系统设计中可以选择的存储结构一般有三大类:数据库系统,文件系统,缓存系统。其中数据库系统又分为关系型数据库(SQL Database)和非关系型数据库(NoSQL Database)。
确定存储结构后,我们需要细化数据表结构,面试中可以通过画图展示数据存储和读取的流程。
用过前3个步骤的分析,我们已经得到了一个可行方案,注意是Work Solution而不是Perfect Solution,这个方案可以存在很多待解决的缺陷。
所以需要4S分析法的最后一步,Scale 扩展。
这一步主要分两部分,一个是优化,包括解决设计缺陷,更多功能设计以及一些特殊情况如何处理;另一个是维护,包括系统的鲁棒性和扩展性,比如有一台服务器/数据库挂了怎么办?如果有流量暴增,如何扩展?
关于这一步更多的内容,可以来看我主讲的《系统架构设计》,现在前两节限免开放。
最后总结一下系统设计面试中需要注意的点:
- Ask before design. 问清楚再动手设计,不要一上来就冲着一个巨牛的方案去设计;
- No more no less. 不要总想着设计最牛的系统,要设计够用的系统;
- Work solution first. 先设计一个基本能工作的系统,然后再逐步优化;
- Analysis is important than solution. 系统设计没有标准答案,记住答案是没用的,通过分析过程展示知识储备,权衡各种设计方式的利弊。
如果回答对你有帮助,不妨点个赞再走~