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

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

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

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

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

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

v2-24b504c207de89ecaa285714889f22db_b.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

• 5k

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

v2-2d87b5044aba194d8c8bea7b83082777_b.jpg

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

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

v2-575375a5a1ca83b50e527980b62b5120_b.jpg


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

数据库系统 Database

• 关系型数据库 SQL Database

•用户信息 User Table

• 非关系型数据库 NoSQL Database

•推文 Tweets

•社交图谱 Social Graph (followers)

文件系统 File System

•图片、视频 Media Files

缓存系统 Cache

• 不支持数据持久化 Nonpersistent

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

Twitter的数据库大致如下:

Tweet Table

v2-f1d23e4e2024d0371c029f023c40660c_b.jpg


User Table

v2-3387649d5bd349c46d7eaad8c700b165_b.jpg


Photo Table

v2-82613256a39884e4963fe73a62394696_b.jpg

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

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

Pull 原理图

v2-545327e667cd1b22adb6eda6eba23a6a_b.jpg


Push 原理图

v2-ecd8b76935db320c05ea69fc9bc5eed0_b.jpg


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值