说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

支撑5亿用户、1.5亿活跃用户的Twitter最新架构详解及相关实现

HTML文档下载 WORD文档下载 PDF文档下载
Twitter出道之初只是个奋斗在RoR上的小站点,而如今已拥有1.5亿的活跃用户,系统日传输tweet更多达4亿条,并已完成了以服务为核心的系统架构蜕变。

Twitter如今在世界范围内已拥有1.5亿的活跃用户,为了给用户生成timeline(时间轴)需支撑30万QPS,其firehose每秒同样生成22MB数据。整个系统每天传输tweet 4亿条,并且只需要5分钟就可以让一条tweet从Lady Gaga手中呈现到她3100万粉丝的屏幕上。当下Twitter系统的规模及强大的吞吐量确实惹人艳羡,然而在出道之初Twitter也只是个奋斗在 RoR上的小站点而已,下面就一览Twitter如何完成从RoR到以服务为核心的系统架构蜕变。

Twitter系统的一些特性:

1. 当下的Twitter已不满足于Web Ap的现状。Twitter期望成为一组API,驱动世界范围内的移动客户端,成为世界级最大的实时事件链之一。

2. Twitter主导的是消费机制,而不是生产机制。每秒读取timeline的操作就会产生30万次的查询,而每秒的写入请求只有6000左右。

3. 离群值,拥有巨量粉丝的个体开始变得普遍,大量粉丝拥有者发送tweet时会因为大量的扩散而变得缓慢。Twitter试图将这个延时控制在5秒内,但是也并非一直生效,特别是名人们发送tweet以及相互转发变得越来越频繁后。这样就导致转发的内容可能比原始内容先一步到达共同粉丝的界面上,这样一来,就高价值用户来说,Twitter的主要精力必须从写操作转移到读操作上。

4. 使用Redis集群处理Home Timeline(首页时间轴,包含了众多关注者的tweet),最大条数为800。

5. 从你关注的人和你点击的链接,Twitter可以获知一系列关于你的信息。

6. 用户最关心的是tweet内容,然而大部分的基础设施却和这些内容不相关。

7. 对如此复杂堆栈进行性能追踪所需求的监视和调试系统往往非常复杂,同样旧决策的影响会不时的出现。

Twitter面临的挑战

1. 1.5亿的用户以及支撑timeline(home及Search)的30万QPS会让最初的具体实现(Naive materialization)变得缓慢。

2. 最初的具体实现由大量选择语句组成,遍及整个Twitter系统,曾今使用后被取缔。

3. 使用一个基于写的扩散方案。在接收到tweet时,系统将做大量的计算以发现tweet需要呈现的用户。这将造就更快、方便的读取,不要对读做任何的计算。由于所有的计算都被安排到写去执行,每秒大约可处理4000个写操作,比读操作要慢一些。

Twitter的团队合作

1. Platform Service团队承担起了Twitter核心基础设施的一切事务:

  • 他们负责Timeline Service、Tweet Service、User Service、Social Graph Service这些驱动Twitter平台的所有组件。
  • 内外客户端使用了大致相同的API
  • 产品团队不需要担心任何规模相关
  • 针对第三方API的注册应用过百万
  • 做容量规划,打造可扩展后端系统架构,在网站超出预期增长时要不断的更换基础设施。

2. Twitter还拥有一个架构团队。负责Twitter的整体架构,维护技术负债列表。

Pull和Push模式

1. 任何时刻都有用户在Twitter上发布内容,Twitter的任务就是考虑如何将消息同步发出并呈现到粉丝。

2. 真正的挑战就是实时性约束,目标则是在5秒内将消息发送到粉丝:

  • 交付意味着尽可能快的收集内容、投入互联网,并且在尽可能短的时间内返回。
  • 交付要做的是发布到内存timeline集群、推送通知以及触发电子邮件,其中包括所有的iOS、黑莓、安卓通知以及SMS。
  • Twitter是最大的SMS制造者
  • Elections可以成为产生内容并且以最快速度扩散内容的最大动力

    3. 两种类型的timeline:user timeline(用户时间轴,即指定用户tweet页)及home timeline

    • user timeline就是一个指定的用户发布的所有tweet
    • Home timeline是你所有关注用户user timeline的一个临时合并
    • 业务规则。非你关注人@你时,将会被自动过滤,转发的tweet也可以被过滤。
    • 在Twitter的规模做这些事情是非常有挑战性的

      Pull模式

      1. 指向timeline,比如Twitter.com及hone_line API。之所以将tweet发送给你,是因为你对其进行了请求。基于Pull的交付:你通过REST API的调用向Twitter请求这些数据。

      2. 查询timeline,搜索API。对资料库进行查询,尽可能快的返回所有匹配指定查询的tweet。

      Push模式

      1. Twitter运行了一个巨型的实时事件系统,通过Firehose以每秒22M的速度推送tweet。

      • 给Twitter打开一个socket,他们将会在150毫秒内完成所有公共tweet的推送。
      • 任何时候给推送集群打开的socket都超过1百万个
      • 使用类似搜索引擎的firehose客户端,所有公共的tweet都通过这些socket传输

        2. 用户流连接。TweetDeck及Mac版的Twitter同样通过这种方式驱动。在登录的时候,Twitter会查看你的社交图,同样也只会推送关注人的消息,重建home timeline,而不是在持久的连接过程中获得同一个timeline。

        3. 查询API,发布一个对tweet的持续查询时,每当有新的tweet发布,并且被认定匹配这个查询,系统会将这条tweet发送给相应的socket。

        高等级基于Pull的timeline

        • Tweet由一个写入API生成,它将会通过负载均衡器及TFE(Twitter Front End)
        • 这种做法很直接,所有的业务逻辑在tweet生成时就已经被执行。
        • 随着tweet的扩散过程开始,新生成的tweet会被投入一个大规模的Redis集群中。每个tweet都会在3个不同的机器上做3个拷贝。因为在Twitter的规模,每天会有大把的机器出故障。
        • 粉丝的查询基于Flock的社交图服务,Flock会维护粉丝及粉丝列表:

        • Flock会返回一个接收者的社交图,并且开始循环访问所有存储在Redis集群上的timeline
        • Redis集群拥有TB级以上的内存
        • 每次投递4K左右的tweet
        • Redis使用原生的表结构
        • 如果你有2万个粉丝,负责粉丝查询的守护进程将会确认2万个用户在Redis集群中的具体位置,然后它会横跨整个Redis集群将Tweet ID插入相应的列表中。所以当你有2万个粉丝时,每条tweet的写入都会造成2万个插入操作。
        • 储存的信息包括新生成tweet的ID、tweet编写者ID以及一个4字节大小的状态信息(转发、评论或者是其它相关)。
        • Home timeline位于Redis集群中,每个有800条tweet。如果你向后翻太多页就没了,RAM是限制列表tweet数量的最大瓶颈。
        • 为了控制延时,所有活跃用户都存储在内存中。
        • 活跃用户的定义是在30天内有登陆过Twitter,当然这个规则可以根据缓存容量、实际使用等进行修改。
        • 如果你不是活跃用户,tweet就不会被放入缓存。
        • 只对home timeline进行存盘(持久化。PS:个人觉得这里应该是user timeline,如果是home timeline下文的重建方法显然不科学,欢迎大家讨论
        • 如果home timeline不在Redis集群中,则需要经历一个重建的过程:

        1. 对社交图服务进行查询,找出你关注的人。分别的访问磁盘获取每个人的数据,然后将他们送回Redis。
        2. 通过Gizzard使用MySQL处理磁盘存储,这将抽象出所有SQL事务并且提供了全局备份。

        • 鉴于每条tweet都会做3个备份,如果其中某台机器发生故障,他们无需对这台机器上的所有timeline进行重建。
        • 当tweet被转发时,将会存储一个指向原tweet的指针。

        • 当做home timeline查询时,Timeline Service将被调用。Timeline Service确认home timeline究竟存在哪台机器上:

        • 鉴于timeline备份在3个不同的机器上,所以需要运行3个不同的哈希环。
        • 一旦找着其中一个,就会尽可能快的返回结果。
        • 虽然这个过程会花费稍长的一点时间,但是读的处理仍然很快。从冷缓存到浏览器上呈现大约需要2秒,其中一个API的调用时间大约400毫秒。

        • 鉴于timeline只包含了tweet的ID,所以还必须要做tweet内容的查询。确定了ID以后,Twitter将通过T-bird并行获取tweet的内容。
        • Gizmoduck是个用户服务,而Tweetypie则是个tweet对象服务,每个服务都拥有自己的独立缓存。用户缓存使用的是memcache集群,缓存了所有用户。Tweetypie处理的是上个月的内容,它将一半的tweet储存在它独立的memcache集群中,当然这个部分服务的是内部用户。
        • 内容的过滤同样会省却一些读取时间,比如过滤掉法国的纳粹相关,这些内容的读取时间在呈现之前就被过滤了。

        高等级的搜索

        1. 所有的计算都通过读来解决,这让写更加简洁

        2. 当有tweet生成时,Ingester会做相应的语法分析和索引,随后会将其传入Early Bird机器中。Early Bird属于Lucene的修改版本,同时索引都储存在内存中。

        3. 在tweet扩散过程中,它可能会被储存在多个home timeline中,其个数由粉丝的数量决定。然而在Early Bird中,一个tweet只会被存入一个Early Bird机器中(不包括备份)。

        4. Blender负责timeline的查询,横跨整个数据中心做集散操作。它对每个Early Bird做查询,以发现与查询条件匹配的内容。如果你搜索“New York Times”,Blender会查询数据中心的所有分片并返回结果,同时还会做分类、合并及重新排序等。排序的规则基于互动的数据,也就是转发、收藏及评论的数量等。

        5. 互动的信息使用写的模式完成,这里会建立一个互动timeline。如果你收藏或者回复一个tweet,将会触发对互动timeline的修改;类似于home timeline,它同样由一系列的互动ID组成,比如收藏ID、评论ID等等。

        6. 所有这些信息都被送到Blender。以读的方式进行重算、合并以及分类,返回的结果就是search timeline为你呈现的界面。

        7. Discovery是个基于你相关信息的定制搜索,这些信息主要来自你关注的人、打开的链接,而重新排序的规则同样基于这些信息。

        Search和Pull是相反的

        1. 搜索和pull看起来非常相似,其实他们有着本质上的区别。

        2. 在home timeline情况下:

        • 写。一个写tweet的动作会触发一个O(n)规模的Redis集群写入操作,n的值取决于粉丝的数量,由此可见处理Lady Gaga及Barack Obama这样拥有数千万粉丝的名人将会很麻烦。Redis集群上的信息都会写入磁盘,Flock集群会将user timeline储存到磁盘上,但是通常情况下timeline在Redis集群的内存中都可以发现。
        • 读。通过API或网络查找Redis是一个常数规模的操作。Twitter对home tiimeline的读操作做了高可用性优化,读操作只花费数十毫秒。这里也可以看出Twitter主导的是一个消费机制,而不是生产机制。每秒可处理30万个读操作,而写操作每秒处理6000个。

          3. 搜索timeline情况:

          • 写。Tweet生成,并且传输到Ingester,只会写入一个Early Bird机器。一个tweet处理的时间大约为5秒,其中包括了排队及寻找待写入的Early Bird 机器。
          • 读。每个读请求都会触发一个O(n)规模的集群读操作。读大约需要100毫秒,搜索不涉及到存盘。所有的Lucene索引都保存在RAM中,所以聚散是非常有效率的,因为不涉及到磁盘。

            4. Tweet的内容基本上与大多数的基础设施都是无关的。T-bird存储了所有tweet内容,大部分的tweet内容都是在内存中。如果没有的话,可以通过select查询将其拉回内存。与tweet内容相关的功能非常少,搜索就是其中一个,而Home timeline则完全不关心。

            未来的工作

            1. 如何将这条数据的管道打造的更快更有效

            2. 在5秒内做到tweet的扩散,但是并不是时刻的奏效,特别是越来越多的高粉单位。

            3. Twitter是非对称的关注,只有你关注人的tweet才会呈现给你。Twitter可以从这些单向关注中获取你更多的信息,有些单向关注同样还影射出一些社会契约。

            4. 问题一般发生在大基数的图上:@ladygaga拥有3100万粉丝,@katyperry拥有2800万粉丝,@justinbieber拥有2800万粉丝,@barackobama拥有2300万粉丝。

            5. 大批量粉丝的拥有者每发送一条tweet将造成数据中心大量的写入操作,而随着越来越多名人之间的交互,挑战变得更加的艰巨。

            6. 这些需要扩散给大批量用户的tweet是Twitter最大的挑战,在关注这些名人的共同粉丝中,经常会出现回复tweet比原文更早一步送达的情况。他们在站点中引入竞态条件,比如最近关注Lady Gaga的粉丝可能会比老早之前关注的粉丝早5分钟看到tweet内容。比如说一个用户先收到了tweet,并进行回复,然而这时候Lady Gaga的原微博并没有扩散完毕,这样就会存在有些用户先看到回复的情况,为用户造成很大的困扰。Tweet通过ID进行排序,因为他们大多数是单调递增的,然而在如此粉丝规模下,这种做法并不奏效。

            7. 寻找读和写途径的合并,不再做如此大规模的扩散;比如传播Taylor Swift新生成的tweet,取代在生成时进行扩散tweet ID,而是在读取时候就进行合并。通过平衡读写途径,节省百分之几十的资源。

            解耦相关

            1. 基于Twitter通过各种途径传播tweet,解耦可以让不同技术团队独立完成自己的工作。

            2. 基于性能问题,系统也需要解耦。Twitter过去使用的一直是完全同步模式,而在两年前因为性能问题他们停用了这个模式。设备接收一个tweet需要145毫秒,接收完毕后就断开所有客户端连接,这么做同样也因为技术负债。写的路径由Ruby驱动,通过MRI实现,一个单线程服务器,每次Unicorn worker分配都会耗尽所有处理性能。每当有tweet流入,Ruby就会接收它,将它放到一个队列中然后断开链接。他们在每台服务器上只运行45-48个进程,这样的话每个机箱能同时处理的tweet数量也是这么多,所以他们必须尽可能快的断开连接。

            3. 当下的tweet已经通过异步模式来处理,而这些讨论也都是建立在异步之上。

            监视相关

            1. 系统性能实时仪表盘

            2. 使用VIZ系统监视每个集群,请求Timeline Service并从Scala集群获取数据的平均时间为5毫秒。

            3. 基于Google Dapper系统的Zipkin,工程师可以通过Zipkin对请求的细节进行监视,比如获取请求所访问的服务及请求时间,这样就可以获知每个请求的性能细节。这样就可以通过每个阶段耗费的时间对系统进行调试,同样也可以从总体上看从请求到交付耗费的时间。花费了两年的时间,Twitter将活跃用户的timeline降到2毫秒。

            部分统计数据:

            • 如果你有100万个粉丝,每个tweet将耗费数秒的时间来传播
            • Tweet输入统计:每天4亿条;日平均统计5000每秒;日统计峰值7000每秒;大事件期间高于1.2万每秒。
            • Timeline交付统计:每天300亿次(更多数据见原文)

            原文链接: The Architecture Twitter Uses to Deal with 150M Active Users, 300K QPS, a 22 MB/S Firehose, and Send Tweets in Under 5 Seconds  (编译/仲浩 审校/周小璐)

            欢迎关注 @CSDN云计算微博,了解更多云信息。

            百度副总裁李明远:百度轻应用——长尾APP的最佳选择 中国工程院院士李德毅:大数据时代的认知计算 创新工场联合创始人汪华:2013年中国移动互联网进入深入区 百度副总裁李明远:解答关于百度轻应用的八大疑问 谷歌推出PNaCl,帮助开发者在任何硬件和网站上运行代码 阿里云:双十一350亿交易额的幕后英雄 索尼移动智能设备全球技术总监Goran Andersson:索尼移动可穿戴设备解决方案 腾讯社交网络事业部副总裁陈磊:腾讯移动开发者服务体系 基调网络副总裁陈靖华:全面掌握移动应用性能 蓝港在线创始人王峰:手游新时代下的机会与挑战! Couchbase CEO Bob Wiederhold:数据库云端同步,移动应用开发的未来 三星电子大中华区副总裁黄伽卫:构建移动互联生态,解读内容服务新方向 MDCC 2013移动开发者大会:新浪潮,新硬件! 网站建设,如何平衡产品特性和利益需求? 开发者是如何提升技能水平的 Databricks核心成员专访:大数据时代“智能手机”Spark 数据密集、快速启动、核心应用,IBM存储重兵布阵 企业移动应用与BYOD:移动互联大势所趋 “首届智能硬件峰会”上午会议亮点汇总 代价究竟高不高,苹果为什么要在Android专利诉讼上花费2亿美元? 产品与设计专题论坛(下):App之美 产品与设计专题论坛(上):扁平还是拟物?产品说了算! 首届移动娱乐游戏峰会:中外手游的交锋与对抗(下) 研发人员超过500,基金会金牌会员,华为豪赌OpenStack New way of thinking:索尼SmartWatch 2应用开发马拉松大赛圆满结束 离了你地球照样转,谷歌地图并非苹果的必需品 面试必备的9大成功秘诀 Chuck Goldman:乔布斯从来不会说苹果不是企业应用的公司 全球最大的图片社交分享网站Pinterest发布首个API UX设计程序的五个谬论 研发周报:2013年美国开发者薪资调查报告 CDONTS.NewMail发送邮件? 继承的问题 我的问题 C++ Primer和C++ Programming Language 哪本好一些呢? 哪位朋友可以给一个PHP4导航栏的代码(1 2 3 4 5 6 这样的) redhat9.0是否支持ich5 在VS2002中可以用的设置星期格式的代码,在VS2003下不能用,为什么? 请教一个关于时间的SQL语句! 关于多级菜单问题 我的电脑里的chm文档打不开了,求救~~~~~~~~~~~! 购买QQ,共1000分(1) 大家帮忙分析一下 请教,关于“name not Unique in this context”的错误。50分,急!!!! 请教一个小问题 显示属性打不开? 购买QQ,共1000分(2) 很简单的问题,最好详细写listput 这个组件怎么用? 80分够不?在线等待中。 改好了告訴我一下,等0點去機房,這邊的認證服務器不動了,VMS系統我不懂 MIDAS 高手请进,这个问题在大富翁上出了600分,也没人拿到,难道真的没人明白吗? 女儿三岁生日,酬宾 关于PHP GD库的问题. jsp主要做什么的?菜鸟问题 为什么会重复显示两次? 怎样恢复类! 有没有人可以帮我的,55 如何把DBF文件导入到SQL2000里? 我想将一个字符串(用户密码)加密,有没有好的算法,请大家指教 熟悉化境编程界HTTP上传程序的请进! 我想将一个字符串(用户密码)加密,有没有好的算法,请大家指教 局域网搜索时,怎样连上要搜索的机子 如何分辨用户是通过在URL栏输入地址,还是点击链接来到本站网页。 好了,我把数据库清理一下,你继续改那几个参数,LOG文件太大先不要管 问题! “多步 OLE DB 操作产生错误。。。”怎么解决?? 急!!! 哪里有内存泄漏检测工具? 请问如何将80*60象素的图片文件转换为120*90象素的图片文件 哪位兄弟试过把csdn的文档里面的文章全部下到本地看的? APL和DOL表的区别?在系统中怎样设置(运用)?最好有示例。多谢先! 如何在一个函数内部知道这个函数的名字? “多步 OLE DB 操作产生错误。。。”怎么解决?? 急!!! _RecordsetPtr对象的Find方法怎样用? 等會過來喝點咖啡吧,今天晚上一定要測完 一个简单的fork问题(那个高手来帮忙呀) 一个关于安装的问题 在VC中用什么函数运行一个程序?像vb中的shell.比如运行QQ.exe 继续散分 急招游戏软件合作伙伴(美国项目外包) 有关更新表中的记录,有没有简洁的办法? 散分的理由 那位大侠能告诉我这是什么原因。Error 404--Not Found 研究生题目,大家试试,帮帮忙 click to make him fall on the models tailor–made models是不是泰勒模型呀?这是有关工业 管理 上的术语“度身定做的模型”和“订制的模型 ”都是字面意思吧?PS: maintenance repair and overhaul heuristic relevance models是什么意思啊?启发式...模型...中间内个怎么翻译呢? standard models是什么意思 explosion models是什么意思 across = a place across表示什么? 未啊未脑哇Q,告诉我这首什么歌,奖赏20 lotsof ( The beach were beautiful making a models 是什么意思 南京领养老金“生存验证”被指不科学 网友质疑延迟退休因养老金缺口 南京人南京人社局:工作失误致百姓奔波 当事津巴布韦航空一客机引擎空中着火 成功艾弗森将退役詹韦致敬 詹姆斯:乔丹之中储粮:2家企业违规进口的转基因菜油足协公布中超最佳候选 里皮埃尔克森得曼城输球主帅火气大 佩莱格里尼:不想NBA新赛季看群雄“灭火” 马刺依然天价球员托雷斯强势复苏 切尔西登上积市民投诉劳动仲裁超期 南京人社局称人土豆烧肉盖饭略谈未被认识的宣德五彩与青花釉里红瓷【沙龙活动】“中国门店之王”是如何炼“死磕”农资质量,看看种地宝出的什么汽车防盗芯片,牙就可解决,瞬间人间蒸一个“事事落后”的创业者,如何逆袭早政治强人普京与俄罗斯未来习近平不为人知趣事 曾误会父亲是总经大师迷奸女孩缠绵10日称可开光如何快速怀孕?遵循六个方法上天籁K歌挑战中国风 赢华为平板M2
            备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘