百度首页 | 
百度搜藏
快照
(百度和http://www.infoq.com/cn/news/2008/05/facebookchatarchitecture的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。)

InfoQ: Facebook Chat的架构

InfoQ

新闻

Facebook Chat的架构

作者 Gavin Terrill译者 孙涛 发布于 2008年5月28日 上午12时26分

社区
Architecture
主题
性能和扩展性
标签
C++,
Erlang

最近在Facebook工程师博客上,软件工程师Eugene Letuchy写了一篇关于Facebook Chat项目的决策细节的文章。

当产品的客户有可能在一夜之间从零增加到七千万的时候,可扩展性就变为从一开始就必须考虑的问题。

Eugene在文中指出了面临如此庞大的客户群会遇到的一系列挑战。首先的挑战是:

在用户上线或者下线时通知其所有好友的做法是非常幼稚可笑的,这么做的代价是O(平均好友个数×高峰期用户数×上下线频率) 条短信/秒, 上下线频率是指用户平均每秒上线和下线的次数。当每个用户好友的平均数量大约在几百个,高峰期同时在线用户数在百万数量级的时候,这种实现方法的效率简直低得无法忍受。

另外一个挑战是实时消息的发送。Facebook采用的是客户端直接从服务器将新消息“拉”的方式,跟Comet的XHR长时间轮询(Comet's XHR Long Polling)过程比较相似。

Facebook的页面会加载一个iframe用于用户间消息的传递, 这个iframe中的Javascript代码发出一个HTTP GET请求,这个请求将建立与服务器的一个持久连接,直到有消息返回给用户为止。

Eugene 接着又提到了“大量长时间的同步请求使得LAMP组合中Apache这一部分成为不确定的实现因素”。在在集群和分区子系统上,Facebook选择了C++和Erlang的组合。C++模块用户用于记录聊天信息,而Erlang模块“将在线用户的对话保存在内存中并且对长时间轮询(long-polled)请求提供支持”。epoll,Linux 2.6中出现的新系统调用,被用于驱动Erlang模块。Eugene 解释了决定选用Erlang的原因:

简单的说就是因为Erlang能很好地满足我们的要求。Erlang是一种面向同步的函数式语言,它具有极其轻量级的用户空间“进程”,无共享的消息传递语义,内置的分布式系统和一个被二十多年实时软件系统实践所检验过的灾难恢复系统。

用于“跨语言可扩展服务部署”的开源框架Thrift(Facebook在去年愚人节发布)被用来将Facebook Chat中用到的各种技术结合起来,其中就包括Erlang的功能绑定。

启动这项服务的方式也比较有意思——利用所谓的“摸黑启动(dark launch)”

一夜间就将客户数由零变为七千万的秘密就在于避免一步到位地完成这个过程。我们会首先模拟很多用户访问的场景,这是通过一个叫做“摸黑启动”的阶段实现的.在这个阶段中Facebook的页面会在没有任何UI元素的情况下连接聊天服务器,询问在线信息和模拟信息发送过程。

Facebook选用Erlang是对此语言认可和肯定,具有重大意义。Erlang的资深布道使Yariv Sadan感慨道:

人们长久以来都认为Erlang只是一个构建可扩展实时应用程序的平台,Facebook选用Erlang应该能消除人们这一偏见。

查看英文原文Facebook Chat Architecture

没有回复

回复

独家内容

书摘和访谈:《FXRuby:用Ruby创建精简的GUI》

《FXRuby:用Ruby创建精简的GUI》是一本关于FXRuby GUI库的新书。InfoQ访问了书的作者Lyle Johnson,还提供了独家的书摘。

在CLR之上的构建领域特定语言

在Ayende Rahien最新的这篇文章中介绍了内部DSL作为创建领域特定语言(DSL)的一种手段,无需考虑设计一门全新语言所带来的复杂性。他比较了适合作为 DSL宿主语言的不同.NET语言,并由于它的元数据编程基础功能、灵活性和性能,提出了Boo是理想的候选语言。

解答有关REST的十点疑惑

本文,Stefan Tilkov解答了人们——尤其是那些深谙基于SOAP/WSDL的Web服务架构手法的人——开始研究REST时容易产生的关于REST的十点疑惑。

用面向服务架构改进医疗系统表现

本文(以《面向服务架构揭秘》(Service Oriented Architecture Demystified)一书中一章为基础)讨论了在医疗领域异构环境中应用SOA的好处。本文以要解决的问题领域为焦点,而非空谈技术,给出了一个关于SOA商业动机的有趣观点。

从玩扑克到软件开发

世上本无银弹。我们虽深知这一点,但我们的行为却常常与之不符。你是否会觉得自己所用的语言、工具或者过程总好过别家?Jay Fields说道,“对症下药,量体裁衣”。正确的决策会因环境、人以及其他因素而异。

开发者眼中的Android手机平台

在四月份的Beijing Openparty上,InfoQ中文站特邀编辑仝健对三位开发者进行了采访,请他们从开发者角度谈一下对Android的认识和感觉。

智能服务契约带来的巨大伸缩性

可伸缩性并不是无状态设计倾向假设的那个布尔值(译注:一般都认为无状态设计的伸缩性好,此处暗示布尔值为True)。Udi的团队使用服务契约来处理多维度的伸缩性问题,避免了二次失败。

使用NetKerne实现REST风格的ESB

Jeremy Deane对使用NetKernel来编写REST风格的ESB应用做了一番深入的研究。他详细地剖析了选择商业ESB应用的决策过程,以及最终如何使用NetKernel来实现该应用。