4

零基础都能懂的【系统设计学习指南】,这个北大学霸的方法太牛了!

 3 years ago
source link: https://zhuanlan.zhihu.com/p/366862533
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

零基础都能懂的【系统设计学习指南】,这个北大学霸的方法太牛了!

FLAG资深工程师,美帝代码搬运工,公众号:九章算法

不少人反馈,面试中遇到系统设计题难以招架。

其实,想要答好系统设计,首先要了解系统设计面试的评分标准

系统设计面试主要考察以下几个方面:

  • 可行解 Work Solution 25%
  • 特定问题 Special Case 20%
  • 分析能力 Analysis 25%
  • 权衡 Tradeoff 15%
  • 知识储备 Knowledge Base 15%

在面试中,常见的错误是面试官给出问题后,候选人就开始怼各种关键词,什么Load Balancer,Memcache,NodeJS,MongoDB,MySQL……

实际上,针对系统设计问题,九章算法有一套4S分析法,即使完全不知道的问题也可以按照这个方法一步步去回答。

所谓4S分析法中的4S是指Scenario(场景),Service(服务),Storage(存储),Scale(扩展)。

v2-e600df238dbc0ff6dd0aa8394da2f6ca_720w.jpg

国内面试常考的秒杀系统可以来看北大学霸令狐冲的讲座直播分享:《2小时详解秒杀系统》

接下来,我们结合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. 系统设计没有标准答案,记住答案是没用的,通过分析过程展示知识储备,权衡各种设计方式的利弊。

如果文章对你有帮助,不妨点个赞再走~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK