系统设计的问题是在国内外大厂面试的常考题,这类问题开放性比较强,没有标准答案,比如设计微博,设计微信,或者是设计某个特定功能,如限制用户的访问频率。
面试官的问题可能很大,但是让你设计的东西未必会很多,设计的难度也未必会很大,极有可能从易到难引导你先设计一些简单的结构。所以掌握这类问题的面试技巧很重要。
如何应对这类问题,我在一个教程上学习到了4S法,总结如下:
4S分析法中的4S是指Scenario(场景),Service(服务),Storage(存储),Scale(扩展)。
第一步:Scenario 场景
在这一步,你需要询问面试官:需要设计哪些功能(也可以自己想),需要承受多大的访问量。
就以设计微博为例,可以把微博的功能一一列出来,但显然无法在短短的一小时的面试里完成所有的功能设计,所以要筛选出核心的功能,比如发微博和浏览微博。
另外,需要考虑系统所承受的QPS(每秒查询次数)大概是多少,需要考虑并发用户,读写频率并掌握相关的计算方法,对一些经验性的数值要记得。
比如一台web服务器的承受量约为1k的QPS,一台关系型数据库的承受量约为1k的QPS,一台非关系型数据库的承受量是10k的QPS。
第二步:Service 服务
所谓服务可以理解为逻辑处理的整合,将同一类问题的逻辑处理处理的整合,对于同一类的问题的逻辑处理可以归并到一个服务。这一步实际上就是将整个系统细分为若干个小的服务。
比如以设计微博为例,我们可以拆分成用户服务,微博服务,关注关系服务,媒体资源服务等等。
第三步:Storage 存储
这一步是4S分析法中最重要的一部分,需要根据每个服务的数据特性选择合适的存储结构,然后细化数据表结构。
系统设计中可以选择的存储结构一般有三大类:数据库系统,文件系统,缓存系统。其中数据库又分为关系型数据库(例如MySQL)和非关系型数据库(NoSQL)。
以设计微博为例,根据前面拆分的服务的特点,用户服务适合用MySQL存储,而微博信息适合用文档型数据库MongoDB存储,多媒体资源可以借助文件系统,如AWS S3,对于热点数据,还可以用Redis做缓存。
另外,我们要向面试官展示数据存储和读取过程。就以微博的feed流为例,如何拿到新鲜事列表,可以采取pull和push两种方式,pull的方式实时的去获取关注人的微博,并做多路归并,push的方式会为每个用户维护自己的新鲜事的记录。
我们要在方案的取舍中体现出自己的专业性,以及tradeoff的能力。
第四步:Scale 扩展
经过前面3个步骤的分析,我们已经得到了一个解决方案,但这个方案还有很多的缺陷,所以需要4S分析法最后一步,扩展。
这一步分为两个部分,一个是优化,包括解决涉及缺陷,更多功能设计以及一些特殊情况如何处理。另一个是维护,包括系统的鲁棒性和扩展性,比如有一台服务器挂了怎么办,比如鹿晗公布恋情导致流量激增怎么办。
总结
最后总结一下系统设计面试过程中的注意点:
- Ask before design. 先跟面试官明确需求再动手设计,不要一上来就冲着一个巨牛的方案去设计。
- No more no less. 不要总想着去设计最牛的系统,而是设计够用的系统。
- Work solution first. 先设计一个基本能工作的MVP产品,再逐步优化。
- Analysis is import than soluton. 系统设计没有标准答案,记住答案是没用的。通过分析过程展示你的知识储备,并权衡各种设计方式的利弊。