从0开始设计Twitter系统架构

标签: 设计 twitter 系统架构 | 发表时间:2021-12-20 00:39 | 作者:老马
出处:http://weekly.dockone.io

【编者的话】Twitter是全球最大的社交网络之一,如果让我们从0开始设计twitter的系统架构,该怎么做呢?有哪些服务是必须的?有哪些点需要提前考虑?这篇文章简单介绍了设计类twitter系统的思路并在最后给出了参考设计。原文: Twitter System Architecture

Twitter是全球领先的在线社交网络服务,用户可以在这里发布和阅读被称为“推文(tweets)”的短消息。在系统架构设计面试过程中,当被问及如何设计Twitter时,大多数候选人都会将其设计为单体服务。然而,将Twitter这样的大型服务设计为单体,表明候选人缺乏设计分布式系统的经验。从微服务甚至lambda(或函数)的角度来设计分布式系统在今天是很正常的选择。目前的趋势是,没有人会将新服务设计为单体,公司正逐渐将其庞大的单体服务转换为一组微服务。因此,候选人应该以微服务的方式设计Twitter。

功能需求

  1. 用户可以发布或分享新的推文(tweet)
  2. 每条推文最多不超过140个字符
  3. 用户可以删除推文,但不能更新/编辑发布的推文(写操作)
  4. 户可以标记喜欢的推文(写操作)
  5. 用户可以关注或取消关注另一个用户(写操作),关注一个用户意味着用户可以看到其他用户在他的时间线上的推文
  6. 可以生成两种类型的时间线(读操作),用户时间线由他最后N个推文组成,主页时间线由他正在关注的用户的热门推文按照时间降序生成
  7. 用户可以根据关键字搜索推文(读操作)
  8. 用户需要有一个帐户来发布或读取推文(暂时使用外部身份服务)
  9. 用户可以注册和删除帐户
  10. Twitter支持包含文字和图片/视频的推文,但在我们当前的设计中,将只支持文本
  11. 分析/监视服务,以确定其负载、运行状况和功能
  12. 分析还可为用户提供关于关注谁、推文通知、热门话题、推送通知和分享推文的意见或建议



非功能需求

  1. 服务的高可用是最重要的需求,这意味着用户可以在自己的主页时间线上阅读推文,而感受不到任何停顿
  2. 生成时间线的时间最长不得超过半秒
  3. 不需要强一致性,只需要最终一致性,可以使用关键词数据库用于搜索基于关键词的推文
  4. 随着用户和推文的增加,系统负载也在增加,因此系统应该具有可伸缩性
  5. 持久化用户数据


现在我们来做一些计算。
  • 日活跃用户平均请求/天 = 150M*60/86400 = 100k/秒
  • 峰值用户 = 平均并发用户* 3 = 300k
  • 三月内最大峰值用户数 = 峰值用户数*2 = 600k
  • 读QPS = 300k
  • 写QPS = 5k



twitter服务的概要设计

由于系统的复杂性,可以将其划分为若干个服务,其中包括若干个微服务。
  1. 推文服务(Tweet service)
  2. 用户时间线服务(User timeline service)
  3. 扇出服务(Fanout Service)
  4. 主页时间线服务(Home timeline service)
  5. 社交网络服务(Social graph service)
  6. 搜索服务(Search service)


下面是Twitter服务中不同逻辑组件或微服务架构。

twitter服务的详细设计

所有微服务都可以被称为模块。

推文服务(Tweet service)

  • 接收用户推文,转发用户推文到关注者时间线和搜索服务
  • 存储用户信息,推文信息,包括用户的推文数量以及用户喜欢的状态
  • 包括应用服务器、分布式的内存缓存以及后端的分布式数据库,或者使用直接由数据库(例如Redis)支持的内存缓存



然后我们看一下tweet服务的数据库表结构。

用户(Users)表包含用户的所有信息,推文(Tweet)表存储所有推文,Favorite_tweet表存储了喜欢的推文记录,也就是说,每当用户喜欢一条推文时,就会在Favorite_tweet表中插入一条记录。

生成唯一的推文Id


当用户调用postTweet()时,调用会发送给应用服务器。应用服务器为该推文生成一个唯一的id,同样的机制也可以用来为推文生成短URL。另一个方式是基于应用服务器的UUID(Universally unique identifier)。推文ID生成后,应用服务器将该推文插入分布式缓存和数据库的tweet表中。由于需要在执行推文的创建/更新/删除操作的同时更新缓存和数据库,所以我们使用缓存透写机制。

可扩展性设计

我们可以将分布式缓存和数据库划分为多个分区和副本。
  • 基于用户ID分片
  • 基于推文ID分片
  • 基于用户ID和推文ID进行两层/级别分片




社交网络服务(Social graph service)

  • 实现Following API,跟踪用户之间的关注关系
  • 包括应用服务器、分布式缓存和数据库
  • 用于存储用户关系的数据库表结构



Following API:
  • 将被关注用户的时间线异步合并到关注者的信息事件流中
  • 取消关注一个用户后,从关注者的事件流中异步删除他的推文
  • 异步的从信息事件流中挑选推文
  • 之所以需要异步操作,是因为这个过程比较慢,而用户在关注和取消关注其他用户时,希望很快得到反馈
  • 异步的缺点是用户在取消关注后,如果刷新信息事件流,会发现这些信息仍然存在,但最终它们会被删除


用户时间线服务(User timeline service)

  • 返回用户的时间线,以降序排列的方式包含用户所有推文。此服务可用于主页时间线或其他用户的时间线。
  • 该服务包括应用服务器和分布式内存缓存,但没有涉及该服务的数据库。
  • 用户时间线是使用包含用户推文链接列表的数据结构设计的



  • 当用户发布一条推文时,tweet服务调用用户时间线服务,将该推文插入到用户时间线的推文列表顶部,运算复杂度为O(1)。
  • 此外,分析仪表板可以配置参数K,表示可以保留的推文个数,K默认为1000,表示保留用户时间线轴中的最后K条推文。
  • 在用户时间线列表中,推文按creationTime(创建时间)降序存储。当用户时间线列表达到最大K条推文时,最老的条目将被删除。


扇出服务(Fanout Service)

  • 将新推文转发到搜索和主页时间线服务,以及其他组件/微服务,比如趋势服务或通知服务
  • 由多个分布式队列组成
  • 当用户发送一条推文消息时,该服务把消息放入推文队列,社交网络服务必须获得用户的关注者列表,并在第二组队列中插入尽可能多的消息。对于名人用户来说,他们拥有非常多的粉丝,其粉丝数甚至超过了每次推送的阈值。那么,如何处理这个问题呢?
  • 该服务是一个先进先出的任务队列列表,处理共享相同列表的任务,并在完成后反馈给队列服务器。队列服务器是异步任务的重要组成部分,其执行的任务可能不会立即收到响应,但却能够保证最终一致性。


主页时间线服务(Home timeline service)

  • 显示用户的主页时间线
  • 包括来自其他关注的用户的推文,按照推文的creationTime(创建时间)降序显示。
  • 其设计类似于用户时间线服务。
  • 但是比用户时间线服务稍微复杂一点,因为用户将插入最新的推文,并且当推文数量超过K值时需要删除最老的推文,如果用户关注了很多其他用户,服务还需要一些机制来给不同关注用户的推文赋予不同的权重。


搜索服务(Search service)

  • 为用户提供搜索查询服务
  • 扇出服务将推文传递给搜索服务



  • Ingester(或ingestion engine):给推文标记上许多标签、术语或关键字。例如这条推文:“我想成为像亚马逊的杰夫·贝索斯一样非常富有的人”,它会过滤掉那些在搜索中没有用的词。除了杰夫·贝索斯(Jeff Bezos)和亚马逊(Amazon),所有其他词都将被丢弃。Ingester可以通过配置或数据库获得词汇表。
  • 一个叫做“词根提取(stemming)”的过程对剩下的单词进行分析,以确定它们的词根。Stemming是处理词干、词根或词根的词形变化(或派生)的过程。因此,会在数据库中保存一个查找表。这种方法的优点是可以简单、快速、轻松的处理异常。缺点是新的或不熟悉的单词即使是完全符合规则的,也不会被处理。
  • 传递到搜索索引
  • 搜索索引微服务将创建反向索引,并存储从内容(如单词)到其所在文档或一组文档中的位置的术语映射索引,在我们的例子中,这是一个或一组推文。
  • Blender服务:在twitter平台上为用户提供搜索查询。当请求搜索查询时,首先确定搜索条件,然后进行词干分析,最后使用词根在术语的倒排索引上运行搜索查询。


照片和视频

  • 使用NoSQL数据库
  • 媒体文件(使用文件系统)
  • 数据表格式



Twitter的网络


Twitter的最终详细设计

系统设计:

数据架构:


译文链接: https://mp.weixin.qq.com/s/v08_YF78Im-Z_Qy8iX3yMQ

相关 [设计 twitter 系统架构] 推荐:

从0开始设计Twitter系统架构

- - DockOne.io
【编者的话】Twitter是全球最大的社交网络之一,如果让我们从0开始设计twitter的系统架构,该怎么做呢. 这篇文章简单介绍了设计类twitter系统的思路并在最后给出了参考设计. 原文: Twitter System Architecture. Twitter是全球领先的在线社交网络服务,用户可以在这里发布和阅读被称为“推文(tweets)”的短消息.

twitter系统架构分析

- - 企业架构 - ITeye博客
twitter系统架构分析. (一)twitter的核心业务. twitter的核心业务,在于following和be followed:. (1)following-关注. 进入个人主页,会看到你follow的人发表的留言(不超过140个字),这是following的过程;. (2)followed-被关注.

Twitter新系统架构性能大幅度提升

- - IT经理网
8月3日《天空之城》在日本的热播创下每秒新增143119条推文的Twitter峰值记录,是Twitter平均每秒发推数(TPS)5700条的25倍. 值得注意的是,在这次毫无征兆的“洪峰”到来时,Twitter全新的系统平台并没有被潮水般涌来的推文堵塞而产生任何延迟甚至宕机. Twitter旧架构与新架构的性能对比.

网购秒杀系统架构设计

- - 企业架构 - ITeye博客
秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必须会对现有业务造成冲击,稍有不慎可能导致整个网站瘫痪. 用户在秒杀开始前,通过不停刷新浏览器页面以保证不会错过秒杀,这些请求如果按照一般的网站应用架构,访问应用服务器、连接数据库,会对应用服务器和数据库服务器造成极大的负载压力.

O2O供应链系统架构设计

- - 美团技术团队
本文是美团技术沙龙第一期, O2O技术架构与实践上的分享内容. 请在微信搜索“美团技术团队”关注我们的公众账号,了解更多活动信息. 英国知名供应链专家Martin Christopher曾经说过一句非常深刻的话:“21世纪的竞争不是企业和企业之间的竞争,而是供应链和供应链之间的竞争. 在风云变幻、寡头纷争的O2O战场,美团屡出重拳并步步为营,战绩不俗.

灰度发布系统架构设计

- - 掘金 架构
互联网产品需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题可以很快控制影响面,就需要设计一套灰度发布系统. 灰度发布系统的作用,可以根据配置,将用户的流量导到新上线的系统上,来快速验证新的功能,而一旦出现问题,也可以马上的修复,简单的说,就是一套A/B Test系统. 灰度发布允许带着bug上线,只要bug不是致命的,当然这个bug是不知道的情况下,如果知道就要很快的改掉.

Netflix系统架构设计方案

- - DockOne.io
【编者的话】Netflix是全球最大的在线视频网站之一,它是怎么设计的呢. 这篇文章介绍了Netflix系统架构的设计方案. 原文: Netflix System Architecture. 我们来讨论一下如何设计Netflix. 相信每个人都会通过某些网站或应用在线追剧或者看电影,而Netflix是我最喜欢的在线视频网站,不过今天我不推荐任何电影,相反,我想展示的是Netflix背后令人惊艳的系统逻辑.

解剖Twitter:Twitter系统架构设计分析

- flychen50 - 互联网的那点事
随着信息爆炸的加剧,微博客网站Twitter横空出世了. 用横空出世这个词来形容Twitter的成长,并不夸张. 从2006年5月Twitter上线,到2007年12月,一年半的时间里,Twitter用户数从0增长到6.6万. 又过了一年,2008年12月,Twitter的用户数达到5百万. Twitter网站的成功,先决条件是能够同时给千万用户提供服务,而且提供服务的速度要快.

海尔电商峰值系统架构设计最佳实践

- - 博客园_知识库
  多数电商平台都会经历相似的过程,流量和业绩每年以几倍至十几倍的速度增长,每年都要接受几次大规模、全方位的系统检阅,例如双11、周年庆等购物狂欢节,期间流量和订单可能是日常的十几倍甚至几十倍,产生的峰值对平台形成极其强烈的冲击,对电商平台的架构带来巨大的考验. 因此,对电商平台的规划和架构工作不仅要高瞻远瞩,而且要细致入微,否则将导致平台无法满足高速增长的业务发展,细微处的失误也可能造成严重后果,不仅影响业务指标的实现,还可能导致对系统进行重新架构,劳时费力又伤钱.