FCon7折倒计时最后一周:日程已上线70%!查看详情>>> 了解详情
写点什么

Facebook Chat 的架构

  • 2008-05-28
  • 本文字数:1096 字

    阅读完需:约 4 分钟

最近在 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

2008-05-28 00:264912
用户头像

发布了 23 篇内容, 共 44294 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

【科创人】维格表创始人陈霈霖:喜茶数字化转型的结晶是vika维格表

科创人

Navicat操作MySQL简易教程

Simon

MySQL navicat

万物互联网络在企业中的价值和展望 | 趋势解读

浪潮云

物联网

BOE(京东方)物联网解决方案让会议更“智慧”

爱极客侠

如何写好操作类说明文档

lenka

3月日更

GitHub Action + ACK:云原生 DevOps 落地利器

阿里巴巴云原生

容器 运维 云原生 k8s 应用服务中间件

【死磕JVM】一道面试题引发的“栈帧”!!!

牧小农

JVM Java虚拟机 运行时数据区 Java虚拟机栈 栈帧

啥子叫递归哟!!!(阶乘)

依旧廖凯

28天写作 3月日更

翻译:《实用的Python编程》06_01_Iteration_protocol

codists

Python

Python 初学者必看:Python 异常处理集合

华为云开发者联盟

Python 异常 代码 程序 错误

华为18级工程师总结的50W字算法、LeetCode、操作系统、计算机底层刷题必备笔记

Java架构之路

Java 程序员 架构 面试 编程语言

面试字节跳动定级2-2,拿32*16offer,P8大佬的算法教程给了我春天!

Java架构之路

Java 程序员 架构 面试 编程语言

使用 Arthas 排查 SpringBoot 诡异耗时的 Bug

阿里巴巴云原生

Java 开发者 云原生 中间件 Arthas

集成融云 IMLib 时,如何实现一套类似于 IMKit 的用户信息管理机制

融云 RongCloud

阿里P7亲自讲解!整理几个重要的Android知识,最全Android知识总结

欢喜学安卓

android 程序员 面试 移动开发

TCP拥塞控制四种算法

赖猫

TCP 网络协议

架构师训练营第六周作业 - 命题作业

阿德儿

基于 SparkMLlib 智能课堂教学评价系统 - 系统实现(四)

大数据技术指南

大数据 spark 智能时代 28天写作 3月日更

《精通比特币》学习笔记(第十一章)

棉花糖

区块链 学习 3月日更

中台还没建就开始拆中台了?医疗中台何去何从?

菜根老谭

中台 医疗中台

融云聊天室属性 kv

融云 RongCloud

音视频

架构师训练营第十周作业 - 命题作业

阿德儿

解析分布式应用框架Ray架构源码

华为云开发者联盟

gRPC API 框架 ray 分布式应用框架

三步上线自己的在线监考系统

融云 RongCloud

镁信健康“互联网+医+药+险”模式能否打造出中国版联合健康?

E科讯

阿里P7亲自教你!一线互联网大厂中高级Android面试真题收录!讲的明明白白!

欢喜学安卓

android 程序员 面试 移动开发

一分钟了解EFT公链新一代超级DeFi公链——EGG超级公链

币圈那点事

区块链 公链 挖矿

腾讯高级工程师保姆级“Java成长手册”,层层递进,全是精华

Java架构追梦

Java 腾讯 面试 架构师

恭喜自己2021金三银四收到的第五个Offer:字节跳动Java研发岗

比伯

Java 编程 架构 面试 程序人生

本科毕业,六年Java开发经验,阿里技术三面+HR面,拿下38*16薪资P7offer

Java架构之路

Java 程序员 架构 面试 编程语言

学以至用-从“0”到“1”设计千万级交易系统

ninetyhe

高可用 分布式系统 海量数据库的设计与实践 异步削峰

  • 扫码添加小助手
    领取最新资料包
Facebook Chat的架构_C++_Gavin Terrill_InfoQ精选文章