29

是时候学习设计Twitter系统了!北大学霸、ACM金牌选手开课,课件、笔记同步更新

 3 years ago
source link: https://zhuanlan.zhihu.com/p/365257301
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.

是时候学习设计Twitter系统了!北大学霸、ACM金牌选手开课,课件、笔记同步更新

美帝代码搬运工,资深面试官,微信公众号-九章算法

很多人在面试中经常会遇到系统设计类问题,尤其是web后端开发,考的频率特别高。因为系统设计设计的知识点非常多,能够全方位的检验候选人的知识储备及技术水平。

就拿设计Twitter来说,他本质上就是在考高可用的信息流系统,其涉及的技术知识多,难度大。也更能检验面试者水平,而且从L3~L5都能问到。

北大学霸,ACM金牌选手令狐冲将在《Twitter后端系统 - Django项目实战》课上手把手带大家完成Twitter项目撰写万行代码,最后可以按工业化要求产出的可上线产品

对于面试官常考的:实现设计登陆、发推、点赞、关注、取关等一系列功能及技术难点都会在首节试听课中详细介绍,欢迎免费试听~

首先先来了解下推特的架构

v2-24b504c207de89ecaa285714889f22db_720w.jpg

如果面试官对你说:请设计一个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

以上分析计算的过程可以用来参考。

第三步:将大系统拆分成小服务

Twitter的系统服务设计大致如下:


第四步:确认数据的存储和访问

数据库系统 Database

• 关系型数据库 SQL Database

•用户信息 User Table

• 非关系型数据库 NoSQL Database

•推文 Tweets

•社交图谱 Social Graph (followers)

文件系统 File System

•图片、视频 Media Files

缓存系统 Cache

• 不支持数据持久化 Nonpersistent

• 效率高,内存级访问速度

Twitter的数据库大致如下:

Tweet Table

User Table

Photo Table

通过以上4个步骤,我们可以得出一套可行的4S解决方案,更多设计Twitter的详细步骤,将会《Twitter后端项目课》中做出详细讲解。

与此同时,在存取News Feed的问题上,还需要区分 Pull 和 Push,在这里将 Pull 和 Push的原理图分享给大家。

Pull 原理图

Push 原理图


几个关于设计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节课免费试听,有兴趣的同学可以先来占个坑。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK