深入浅出系统设计面试——Design Twitter Timeline

如何 design 一个 Twitter 类型的系统,尤其是其中的 timeline/tweets 的部分,这是很多朋友都会在面试中遇到的问题,包子君今天与大家快速分享一下。

首先,Twitter 绝对不是我们能在45分钟之内 design 出来的,除非你是 Twitter 的人出去面试……所以主要就是聊聊难点在哪里。

Home Timeline

社交类产品的一个最重要的 feature 就是 home timeline, 不管是微博、朋友圈、Facebook、Twitter, 只要你关注的人发了一条新消息,你的 home page 就应该快速更新显示。

当然,最 naive 的方案大家都能猜到:把消息存储设计成一个大 database, 每次用户刷新时就一堆 table 互相 join 来 join 去,然后 select + index. 但是你马上会发现当有大量用户同时刷新、或有大V发一条消息的时候,事情就变得比较微妙了,那么解决方案是什么呢?

下面的分析来自与 2012 年 Raffi 大神关于 twitter 设计的公开视频,点击“阅读原文”可查看 youtube 视频,还有包子君的大连话版的 leetcode 讲解哟。

  • 社交产品的一个重要特点就是 consumption heavy, but not production heavy. 举个例子:100 个用户在一个社交网络中,大约10个人主动发更新状态,10个人愿意评论别人的状态,剩下80个人则是默默的刷呀刷。这就是社交网络的特点,也决定了社交产品的系统架构应该集中优化“读”这个操作。
  • 既然每次刷新的速度越快越好,那么最快的方式自然是从服务器的内存中直接读取。事实上 twitter 就是这么干的:简单来说每个 user maintain 一个 queue 来保存用户收到的 tweet id / metadata,这个 queue 放在 redis cluster 里面 (redis 是一个in-memory datastore store), 所以读取的速度非常非常快,网络内的调用延迟在 400ms 左右,考虑到 twitter 的用户量,令人满意。
  • 当用户发一条 tweet, twitter 内部有一个 fanout process 来保证这条 twitter id / metadata 被写入每一个 user 的 queue 中 (in redis cluster). 比如 User A 有 10000 followers, 当 A 发一条 tweet, twitter 需要先通过一个单独的 social graph service, 查询 User A 的 10000 followers 以及每个人 queue 所在 redis cluster 的位置,然后插入 tweet id / metadata 到每一个 queue 中。

这种设计的方式最大程度的优化了”读/刷新“操作,但是“写操作”会相对复杂一些,这是典型的系统设计中的 trade-off. 当我们在面试中遇到系统设计类的问题是,一定要想清楚、或者问清楚系统最大的 scability issue 是什么,是读操作还是写操作,还是查询?只有搞清要解决的问题,我们才能更好的切入问题,进而解决之。

原文发布于微信公众号 - 包子铺里聊IT(baozitraining)

原文发表时间:2015-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA高级架构

Java开发工程师理解的三种架构模型

常用的软件架构模型可以归类为三种架构模型:3/N层架构、“框架+插件”架构、地域分布式架构。 一.三种架构模型 1.3/N层架构 这是经典的多层架构模型,对于稍...

3447
来自专栏WeTest质量开放平台团队的专栏

灵活应对流量压力,定期压测服务器,鹿晗结婚都不怕

鹿晗与关晓彤恋情公布,粉丝炸了,微博的服务器也跟着瘫痪了,,你的服务器还好吗?

3010
来自专栏微信小程序开发

看一下小程序中接入广告的具体步骤

昨天,很多小程序开发者都收到了“流量主测试邀请”。连胜老师也就尝试了给自家小程序添加广告。 之前有不少小程序开发者,都尝试过在小程序中变现,红包类小程序可以说最...

8139
来自专栏IT技术精选文摘

我们是如何将App的大小从31M减少到2.6M的?

然后呢? 首先,将我们的任务简化为三个点。 “近期动态” “视频动态” “音频动态” 最开始我们都很兴奋,只用了2到3天就完成了“近期动态”这一功能。毕竟对于我...

3186
来自专栏软件测试经验与教训

自动化测试实施方案

1.1K6
来自专栏hadoop学习笔记

Hadoop基础入门之发行版本的选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬...

1091
来自专栏我的小碗汤

GitHub上优秀的Go开源项目

近一年来,学习和研究Go语言,断断续续的收集了一些比较优秀的开源项目,这些项目都非常不错,可以供我们学习和研究Go用,从中可以学到很多关于Go的使用、技巧以及相...

1504
来自专栏云计算D1net

混合云/多云环境如何部署微服务

微服务能够为混合云或多云部署带来大量的好处,但是它们也能够带来与网络、安全性等相关的新挑战。 ? 大多数IT企业已经开始认识到在开发和部署中实施软件组件化的好处...

3539
来自专栏张善友的专栏

Java EE企业系统性能问题的原因和解决建议[也适用于.NET]

Pierre-Hugues Charbonneau(昵称是P-H)是加拿大CGI公司的高级IT顾问和系统架构师。近日他发表了题为《导致Java EE企业性能问题...

1935
来自专栏DevOps时代的专栏

干货 | 基于 DevOps 的微服务生态系统与工程实践(三)

往期回顾: 第一部分:微服务与 DevOps 干货 | 基于 DevOps 的微服务生态系统与工程实践(一) 第二部分:微服务生态系统 干货 | 基于 Dev...

20810

扫码关注云+社区

领取腾讯云代金券