如何设计一个微博系统
《如何设计一个微博系统》共 0.5 万字,通篇围绕 面试、缓存、场景、架构 展开,归在「后端与系统架构」这一层。
适合给 AI 系统搭底座、要管得住的人
目录骨架(8 节)
- 系统设计在考察什么?
- 常见误区
- 如何搞定系统设计 - 4 步法
- 实战4步法解决Weibo设计
- 没有方向,只提出各种关键词
- 一开始直奔最优解
- 闷头设计不沟通
- 1. 确定问题需求
目录 · 3 节
本次分享内容
- 系统设计在考察什么?
- 系统设计常见误区
- 如何搞定系统设计(4步法)
- 实战4步法解决微博设计(确定场景、整体设计、核心模块、拓展设计)
系统设计在考察什么?
系统设计面试中,经常会被问到如何设计微信、如何设计微博、微信朋友圈、百度、12306系统…… 如果是没有准备过,一般都会不知所措,难以找到切入点,我们怎么能在如此短的时间内设计出来一个由成千上万的码农、PM,经年累月地迭代出来的如此优秀的产品?如果面试者这么优秀,那还面试啥?百度、谷歌也不可能只是一个搜索框而已,底下的东西复杂去了。本次分享会介绍一个解决系统设计类问题的通用框架,无论什么问题,朝这几步走,一定能找到解决办法。
所以首先要明确,系统问题的答案一定不可能是全面的,面试官也不会期望我们给出一个满分答案。所谓的系统设计面试实际上是在模拟一个场景:两名同事在一起就一个模糊的问题,讨论一番,得出一个还不错的解决方案。
因此在这个过程中,我们需要与面试官进行充分的沟通,了解清楚需求,回应面试管的各种问题,阐述我们设计的方案。最终设计的结果是开放性的,没有标准答案;而面试官会在这个过程中,会充分挖掘我们的沟通、分析、解决问题的能力,最后给出通过与否的结论。
常见误区
没有方向,只提出各种关键词
在面试中,常见的错误是面试官给出问题后,候选人就开始怼各种关键词,什么 Load Balancer,Memcache,NodeJS,MongoDB,MySQL.
不是说我们不能说这些技术词汇,但是系统设计首先我们需要搞清楚具体的需求,然后在大概确定系统架构,最后才根据场景进行技术选型,因为并不存在一个完全完美的系统设计,往往都是各方面之间的均衡,至于如何均衡,需要结合面试官的要求和具体实际来选择。
一开始直奔最优解
系统设计考察我们如何去解决一个具体的问题,在实际工作中,我们也是先实现功能之后,再在此基础上去进行针对性的优化;在面试中同样也十分重要,一方面,面试官希望看到你从一开始设计系统,到慢慢完善的过程,另外,系统设计其实没有最优解,往往都是各种因素之间权衡后的结果,就像 CAP 理论一样,无法同时满足,我们的系统只要能满足面试官提出来的要求,刚好够用就行。
闷头设计不沟通
很多人在听到问题之后,就开始闷头设计,丝毫不会和面试官进行沟通交流。这样不仅不利于自己理解题目意图,而且让面试官无法了解你是如何一步步去解决问题的过程。
这个时候可以把面试官当做一位同事,比如你对题目不理解,可以提出问题搞清楚题目意图;又比如你在哪个环节卡住了,也不要一直闷在那,可以大胆向面试官求助寻求提示,也能节省不少时间。
就像开始说的,系统设计没有最优解,你的思路和解决问题的过程很重要,而这些就是通过不断的沟通来传递给面试官的。
如何搞定系统设计 - 4 步法
针对系统设计,这里给大家提供一个 4 步法解决方案,无论是任何系统设计的题目,都可以按照这几步去思考解决。
1. 确定问题需求
这一步主要是确定问题的需求和系统使用场景,为了搞清楚这个问题,需要和面试官你来我往地问问题。
在做设计的同时,问面试官的要求是什么,做出合理的假设、取舍,让面试官看出你的思考过程,最终综合所有的信息完成一个还不错的设计。不要害怕问问题。那并不会说明我们不懂,而是让面试官理解我们的思考过程。当我们问出问题后,面试官要么给出明确的回答;要么让我们自己做出假设。当需要做出假设时,我们需要把假设写下来备用。
这个举个例子,比如面试官让你设计 weibo,因为 weibo 的功能较为庞大,例如发微博、微博时间线、关注、取消关注、微博热搜榜等等,我们无法在短短的面试时间内完成这么多功能设计,所以这时候可以询问面试官我们需要实现哪些功能。
比如需要实现微博时间线的功能,我们得进一步确认,整体用户量多大,系统的 QPS 多大,因为这涉及到我们后续的系统设计,而且如果对于 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。
