• Twitter网站架构介绍
    时间:2012-01-20   作者:佚名   出处:互联网

    作为140个字的缔造者,twitter太简单了,又太复杂了,简单是因为仅仅用140个字居然使有几次世界性事件的传播速度超过任何媒体,复杂是因为要为2亿用户提供这看似简单的140个字的服务,这真的是因为简单,所以复杂。可是比较遗憾的是目前在中国大陆twitter是无法访问的,但作为一个爱好架构的程序猿,这道墙是必须得翻的,墙外的世界更精彩。今天就结合网络上的一些资料,来浅谈一下我对twitter网站架构的学习体会,希望给路过的朋友一点启示.......

    一、twitter网站基本情况概览
    截至2011年4月,twitter的注册用户约为1.75亿,并以每天300000的新用户注册数增长,但是其真正的活跃用户远远小于这个数目,大部分注册用户都是没有关注者或没有关注别人的,这也是与facebook的6亿活跃用户不能相提并论的。
    twitter每月有180万独立访问用户数,并且75%的流量来自twitter.com以外的网站。每天通过API有30亿次请求,每天平均产生5500次tweet,37%活跃用户为手机用户,约60%的tweet来自第三方的应用。
    平台:Ruby on Rails 、Erlang 、MySQL 、Mongrel 、Munin 、Nagios 、Google Analytics 、AWStats 、Memcached
    下图是twitter的整体架构设计图:
    twitter的整体架构设计图
    二、twitter的平台
    twitter平台大致由twitter.com、手机以及第三方应用构成,如下图所示:
    twitter的平台
    其中流量主要以手机和第三方为主要来源。
    Ruby on Rails:web应用程序的框架
    Erlang:通用的面向并发的编程语言,开源项目地址:http://www.erlang.org/
    AWStats:实时日志分析系统:开源项目地址:http://awstats.sourceforge.net/
    Memcached:分布式内存缓存组建
    Starling:Ruby开发的轻量级消息队列
    Varnish:高性能开源HTTP加速器
    Kestrel:scala编写的消息中间件,开源项目地址:http://github.com/robey/kestrel
    Comet Server:Comet是一种ajax长连接技术,利用Comet可以实现服务器主动向web浏览器推送数据,从而避免客户端的轮询带来的性能损失。
    libmemcached:一个memcached客户端
    使用mysql数据库服务器
    Mongrel:Ruby的http服务器,专门应用于rails,开源项目地址:http://rubyforge.org/projects/mongrel/
    Munin:服务端监控程序,项目地址:http://munin-monitoring.org/
    Nagios:网络监控系统,项目地址:http://www.nagios.org/
    三、缓存
    讲着讲着就又说到缓存了,确实,缓存在大型web项目中起到了举足轻重的作用,毕竟数据越靠近CPU存取速度越快。下图是twitter的缓存架构图:
    twitter的缓存架构图
    大量使用memcached作缓存
    例如,如果获得一个count非常慢,你可以将count在1毫秒内扔入memcached
    获取朋友的状态是很复杂的,这有安全等其他问题,所以朋友的状态更新后扔在缓存里而不是做一个查询。不会接触到数据库
    ActiveRecord对象很大所以没有被缓存。Twitter将critical的属性存储在一个哈希里并且当访问时迟加载
    90%的请求为API请求。所以在前端不做任何page和fragment缓存。页面非常时间敏感所以效率不高,但Twitter缓存了API请求
    在memcached缓存策略中,又有所改进,如下所述:
    1、创建一个直写式向量缓存Vector Cache,包含了一个tweet ID的数组,tweet ID是序列化的64位整数,命中率是99%
    2、加入一个直写式行缓存Row Cache,它包含了数据库记录:用户和tweets。这一缓存有着95%的命中率。
    3、引入了一个直读式的碎片缓存Fragmeng Cache,它包含了通过API客户端访问到的sweets序列化版本,这些sweets可以被打包成json、xml或者Atom格式,同样也有着95%的命中率。
    4、为页面缓存创建一个单独的缓存池Page Cache。该页面缓存池使用了一个分代的键模式,而不是直接的实效。
    四、消息队列
    大量使用消息。生产者生产消息并放入队列,然后分发给消费者。Twitter主要的功能是作为不同形式(SMS,Web,IM等等)之间的消息桥
    使用DRb,这意味着分布式Ruby。有一个库允许你通过TCP/IP从远程Ruby对象发送和接收消息,但是它有点脆弱
    移到Rinda,它是使用tuplespace模型的一个分享队列,但是队列是持久的,当失败时消息会丢失
    尝试了Erlang
    移到Starling,用Ruby写的一个分布式队列
    分布式队列通过将它们写入硬盘用来挽救系统崩溃。其他大型网站也使用这种简单的方式
    五、总结
    1、数据库一定要进行合理索引
    2、要尽可能快的认知你的系统,这就要你能灵活地运用各种工具了
    3、缓存,缓存,还是缓存,缓存一切可以缓存的,让你的应用飞起来。
    如果你喜欢架构,你可能还会喜欢以下文章:

    网友留言/评论

    我要留言/评论

    相关文章

    新年伊始,给设计师的 10 条建议:去年我们做的确实很不错。我们为自己而站了起来。我们不再免费工作,我们也开始有了自己的小金库。我们又一次发现了新的排版,我们学会了在设计前先考虑手机客户端的问题。
    我们学会了制作能响应的交互性网站,我们不再在设计上与Lorem ipsum较劲,而开始关注我们正在设计的、实实在在的东西。
    今年呢?今年是一个要命的黄金年代!去年我们是处于训练期,今年我们要开始战斗了!
    推荐12个漂亮的CSS3按钮实现方案:在过去,我们都是使用图片或者JavaScript来实现漂亮的按钮效果,随着越来越多的浏览器对CSS3的支持和完善,使用CSS3来实现美观的按钮已没有太多的障碍。今天,本文收集了12个很不错的CSS3按钮方案并有相关的使用教程。
    HTC刷机和获取ROOT权限详细图文教程:昨晚刷机,花了近4个小时,终于把HTC g12给搞定了,并且还获取了root权限。其中看了大量的资料,为了避免网友们重复造轮子,特此记录一下刷机过程。在此,感谢安智网和安极网论坛,这对我刷机有很大的帮助,其中本文引用了他们的一些资料。废话不多说,开始。
    20 个很有用的 CSS 图形和图表技术及教程:图形和图表主要用于以如饼图、折线图、条形图等方式展示数值数据的直观形式。有众多的技术利用CSS3来创建不同的图表。在任何Web行业,一个良好和优秀的数据演示可以让客户直观了解你分析的内容。
    25 个富有灵感的企业网站设计实例:在当今的企业世界中,拥有一个能够吸引用户的网站,将会是一个很大的优势,因此很多公司企业越来越注重网站的设计,本文将介绍国际上一些比较新颖而富有灵感的企业网站实例,给设计师们提供一些思路。
    盘点 HTML5标签使用的常见误区:最近组内进行HTML5标签的学习,方法呢就是大家每人挑选几个标签,自己先去学习,然后给大家作讲解.这个过程大家还是挺有收获的.但是现在HTML5还处在草案阶段,有些新的标签元素的解释也是经常有变化,甚至标签加入移出也很频繁(比如 hgroup),同时现有的大的门户网站在使用HTML5方面也没有很好的范例可以参考,让大家的学习过程更摸索.下面是我在 html5doctor 上面看到的一篇文章,在目前大家懵懂的阶段,可能看看大师的讲解会更容易理解。由于才疏学浅,很多不明白的地方可能只是做了字面上的翻译,不对的地方还请大家多多指教。
    使用Jquery解析JSON数据的方法介绍:用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明。 这里首先给出JSON字符串集,
    在线检查网页浏览器的兼容性:BrowserShots.org 是一个很不错的在线服务,它主要帮助你检查一下你所设计网站是否兼容所有的浏览器。其目前支持四个操作系统:Linux, Windows, MacOS和BSD。浏览器支持的就多了:包括MSIE,Firefox,Chrome,Safari,Opera,Dillo,SeaMonkey,Navigator等等浏览器的不同版本。
    Web开发中需要了解的东西:在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需要知道的?)里面给出的答案非常不错,所以,我翻译转载过来。 顺便说一下,StackExchange真是非常好,大家可以对同一个答案做贡献和修订,看看这个问题的修订过程你就知道了——专业的问答网站应该怎么去做。这就是我在这篇文章中也说过真正的用户体验是什么样的。
    关于Android应用开发优化的十条建议:随着移动平台的发展和其应用的不断改善,质量成为决定成败的关键。用户要求他们选择安装的应用响应快、性能好,如果某个应用不能提供卓越的功能和稳定的用户体验,那这样的应用注定会被很快卸载。