解剖 Twitter【5】数据流与控制流

2010-03-10 15:26

通过让 Apache 进程空循环的办法,迅速接纳用户的访问,推迟服务,说白了是个缓兵之计,目的是让用户不至于收到 “HTTP 503” 错误提示,“503 错误” 是指 “服务不可用 (Service Unavailable)”,也就是网站拒绝访问。

大禹治水,重在疏导。真正的抗洪能力,体现在蓄洪和泄洪两个方面。蓄洪容易理解,就是建水库,要么建一个超大的水库,要么造众多小水库。泄洪包括两个方面,1. 引流,2. 渠道。

对于 Twitter 系统来说,庞大的服务器集群,尤其是以 MemCached 为主的众多的缓存,体现了蓄洪的容量。引流的手段是 Kestrel 消息队列,用于传递控制指令。渠道是机器与机器之间的数据传输通道,尤其是通往 MemCached 的数据通道。渠道的优劣,在于是否通畅。

Twitter 的设计,与大禹的做法,形相远,实相近。Twitter 系统的抗洪措施,体现在有效地控制数据流,保证在洪峰到达时,能够及时把数据疏散到多个机器上去,从而避免压力过度集中,造成整个系统的瘫痪。

2009 年 6 月,Purewire 公司通过爬 Twitter 网站,跟踪 Twitter 用户之间 “追” 与 “被追” 的关系,估算出 Twitter 用户总量在 7,000,000 左右 [26]。在这 7 百万用户中,不包括那些既不追别人,也不被别人追的孤立用户。也不包括孤岛人群,孤岛内的用户只相互追与被追,不与外界联系。如果加上这 些孤立用户和孤岛用户群,目前 Twitter 的用户总数,或许不会超过 1 千万。

截止 2009 年 3 月,中国移动用户数已达 4.7 亿户 [27]。如果中国移动的飞信 [28] 和 139 说客 [29] 也想往 Twitter 方向发展,那么飞信和 139 的抗洪能力应该设计到多少呢?简单讲,需要把 Twitter 系统的现有规模,至少放大 47 倍。所以,有人 这样评论移动互联网产业,“在中国能做到的事情,在美国一定能做到。反之,不成立”。

但是无论如何,他山之石可以攻玉。这就是我们研究 Twitter 的系统架构,尤其是它的抗洪机制的目的。

Figure 7. Twitter internal flows
Courtesy http://farm3.static.flickr.com/2766/4095392354_66bd4bcc30_o.png

下面举个简单的例子,剖析一下 Twitter 网站内部的流程,借此考察 Twitter 系统有哪些机制,去实现抗洪的三要素,“水库”,“引流” 和 “渠道”。

假设有两个作者,通过浏览器,在 Twitter 网站上发表短信。有一个读者,也通过浏览器,访问网站并阅读他们写的短信。

1. 作者的浏览器与网站建立连接,Apache Web Server 分配一个进程 (Worker Process)。作者登录,Twitter 查找作者的 ID,并作为 Cookie,记忆在 HTTP 邮包的头属性里。

2. 浏览器上传作者新写的短信 (Tweet),Apache 收到短信后,把短信连同作者 ID,转发给 Mongrel Rails Server。然后 Apache 进程进入空循环,等待 Mongrel 的回复,以便更新作者主页,把新写的短信添加上去。

3. Mongrel 收到短信后,给短信分配一个 ID,然后把短信 ID 与作者 ID,缓存到 Vector MemCached 服务器上去。

同时,Mongrel 让 Vector MemCached 查找,有哪些读者 “追” 这位作者。如果 Vector MemCached 没有缓存这些信息,Vector MemCached 自动去 MySQL 数据库查找,得到结果后,缓存起来,以备日后所需。然后,把读者 IDs 回复给 Mongrel。

接着,Mongrel 把短信 ID 与短信正文,缓存到 Row MemCached 服务器上去。

4. Mongrel 通知 Kestrel 消息队列服务器,为每个作者及读者开设一个队列,队列的名称中隐含用户 ID。如果 Kestrel 服务器中已经存在这些队列,那就延用以往的队列。

对应于每个短信,Mongrel 已经从 Vector MemCached 那里知道,有哪些读者追这条短信的作者。Mongrel 把这条短信的 ID,逐个放进每位读者的队列,以及作者本人的队列。

5. 同一台 Mongrel Server,或者另一台 Mongrel Server,在处理某个 Kestrel 队列中的消息前,从这个队列的名称中解析出相应的用户 ID,这个用户,既可能是读者,也可能是作者。

然后 Mongrel 从 Kestrel 队列中,逐个提取消息,解析消息中包含的短信 ID。并从 Row MemCached 缓存器中,查找对应于这个短信 ID 的短信正文。

这时,Mongrel 既得到了用户的 ID,也得到了短信正文。接下去 Mongrel 就着手更新用户的主页,添加上这条短信的正文。

6. Mongrel 把更新后的作者的主页,传递给正在空循环的 Apache 的进程。该进程把作者主页主动传送 (push) 给作者的浏览器。

如果读者的浏览器事先已经登录 Twitter 网站,建立连接,那么 Apache 给该读者也分配了一个进程,该进程也处于空循环状态。Mongrel 把更新后的读者的主页,传递给相应进程,该进程把读者主页主动传递给读者的浏览器。

咋一看,流程似乎不复杂。“水库”,“引流” 和 “渠道”,这抗洪三要素体现在哪里呢?盛名之下的 Twitter,妙处何在?值得细究的看点很多。

Reference,

[26] Twitter user statistics by Purewire, June 2009.
(http://www.nickburcher.com/2009/06/twitter-user-statistics-purewire-report.html)
[27] 截止 2009 年 3 月,中国移动用户数已达 4.7 亿户.
(http://it.sohu.com/20090326/n263018002.shtml)
[28] 中国移动飞信网. (http://www.fetion.com.cn/)
[29] 中国移动 139 说客网. (http://www.139.com/)

登录,参与讨论前请先登录

评论在审核通过后将对所有人可见

正在加载中

移动互联网的围观者、起哄者、以及肇事者。

本篇来自栏目

解锁订阅模式,获得更多专属优质内容