很多人在面试中经常会遇到系统设计类问题,尤其是web后端开发,考的频率特别高。因为系统设计设计的知识点非常多,能够全方位的检验候选人的知识储备及技术水平。
就拿设计Twitter来说,他本质上就是在考高可用的信息流系统,其涉及的技术知识多,难度大。也更能检验面试者水平,而且从L3~L5都能问到。
北大学霸,ACM金牌选手令狐冲将在《Twitter后端系统 - Django项目实战》课上手把手带大家完成Twitter项目撰写万行代码,最后可以按工业化要求产出的可上线产品。
对于面试官常考的:实现设计登陆、发推、点赞、关注、取关等一系列功能及技术难点都会在首节试听课中详细介绍,欢迎免费试听~
首先先来了解下推特的架构
![v2-24b504c207de89ecaa285714889f22db_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/7305cc6178cc29e6cb4fbc6daa4a14ba.jpeg)
如果面试官对你说:请设计一个twitter,你对面试官说的第一句话会是什么?
常见错误就是:关键词大师,上来就罗列一大堆的关键词,如:Load Balancer, Memcache, NodeJS, MongoDB, MySQL…这样的回答方式在面试中会对你非常不利。
正确的做法是
第一步:询问需要设计哪些功能
Step 1:Enumerate(把Twitter的功能一个个罗列出来)
• Register / Login
• User Profile Display / Edit
• Upload Image / Video *
• Search *
• Post / Share a tweet
• Timeline / News Feed
• Follow / Unfollow a user
Step 2:Sort (选出核心功能,因为你不可能这么短的时间什么都设计 )
• Post a Tweet
• Timeline
• News Feed
• Follow / Unfollow a user
• Register / Login
第二步:询问需要承受多大的访问量
并发用户 Concurrent User
• 日活跃 * 每个用户平均请求次数 / 一天多少秒 = 150M * 60 / 86400~ 100k (数据仅为推测值)
• 峰值 Peak = Average Concurrent User * 3 ~ 300k (数据仅为推测值)
• 快速增长的产品 Fast Growing
• MAX peak users in 3 months = Peak users * 2
读频率 Read QPS (Queries Per Second)
• 300k
写频率 Write QPS
• 5k
以上分析计算的过程可以用来参考。
![v2-2d87b5044aba194d8c8bea7b83082777_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/4cf0fd8a42a8703769cdde24617519e6.jpeg)
第三步:将大系统拆分成小服务
Twitter的系统服务设计大致如下:
![v2-575375a5a1ca83b50e527980b62b5120_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/96de3b3fe852bb7f1bb04473659609a6.jpeg)
第四步:确认数据的存储和访问
数据库系统 Database
• 关系型数据库 SQL Database
•用户信息 User Table
• 非关系型数据库 NoSQL Database
•推文 Tweets
•社交图谱 Social Graph (followers)
文件系统 File System
•图片、视频 Media Files
缓存系统 Cache
• 不支持数据持久化 Nonpersistent
• 效率高,内存级访问速度
Twitter的数据库大致如下:
Tweet Table
![v2-f1d23e4e2024d0371c029f023c40660c_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/cdc18b1aa2a6b91bdb94241cf3ca74dc.png)
User Table
![v2-3387649d5bd349c46d7eaad8c700b165_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/eab97b8c8ea07022a8978b9cdfdd7b70.png)
Photo Table
![v2-82613256a39884e4963fe73a62394696_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/90bddeba657777b245e48a0e2c759191.png)
通过以上4个步骤,我们可以得出一套可行的4S解决方案,更多设计Twitter的详细步骤,将会《Twitter后端项目课》中做出详细讲解。
与此同时,在存取News Feed的问题上,还需要区分 Pull 和 Push,在这里将 Pull 和 Push的原理图分享给大家。
Pull 原理图
![v2-545327e667cd1b22adb6eda6eba23a6a_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/ad8c2e406eefbdf1b1b0282894f83fd3.jpeg)
Push 原理图
![v2-ecd8b76935db320c05ea69fc9bc5eed0_b.jpg](https://i-blog.csdnimg.cn/blog_migrate/721d60e406d559cc2bce1d023faf1e7f.jpeg)
几个关于设计Twitter的常见问题:
如何实现 follow 与 unfollow?
• Follow 一个用户之后,异步地将他的 Timeline 合并到你的 News Feed 中
• Merge timeline into news feed asynchronously.
• Unfollow 一个用户之后,异步地将他发的 Tweets 从你的 News Feed 中移除
• Pick out tweets from news feed asynchronously.
为什么需要异步 Async?
• 因为这个过程一点都不快呀
异步的好处?
• 用户迅速得到反馈,似乎马上就 follow / unfollow 成功了
异步的坏处?
• Unfollow 之后刷新 News Feed,发现好像他的信息还在
• 不过最终还是会被删掉的
News Feed 和 Timeline 的定义和区别?
• News Feed:新鲜事,我朋友+我发的所有帖子按照某种顺序排列的整合(比如按照时间排序)
• 用户打开Twitter之后首先看到的界面就是News Feed界面,这些 tweets 来自你关注的用户
• Timeline:某个用户发的所有帖子
• 用户点开某个人的页面之后,看到这个人发的所有帖子
• 在有的系统中,这两个概念的定义会完全反过来,这里我们统一按照上面的定义。
什么是消息队列
• 简单的说就是一个先进先出的任务队列列表
• 做任务的worker进程共享同一个列表
• Workers从列表中获得任务去做,做完之后反馈给队列服务器
• 队列服务器是做异步任务必须有的组成部分
最后,4S解决方案适用于各种高可用性项目,而对于设计一个Twitter来说,就是确保在特定场景下保证系统的稳定性及高可用性。篇幅有限,感兴趣的同学可以来看看《Twitter后端系统 - Django项目实战》。
由Facebook资深架构师带你从零设计Twitter,通过6周的时间快速搭建一个P8(L5)水准的工业级项目。
项目经历不但可以直接写入简历,还会带你真实还原开发环境流程,按照工业化要求产出一个可上线的产品,不是只做一个demo这么简单。前5节课免费试听,有兴趣的同学可以先来占个坑。