Facebook Chat的架构
最近在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_java_client.rar"压缩包包含的"Facebook-Chat"和"FacebookRestClient"是两个关键部分,它们允许开发者实现对Facebook聊天功能以及通过RESTful API进行数据交互的功能。 首先,我们来关注"Facebook-...
本篇文章将基于“react-native-chat-demo-master.zip”这个DEMO,深入探讨如何利用React Native构建一个聊天应用。 一、React Native基础知识 React Native的核心理念是“Learn once, write anywhere”,这意味着...
Facebook的服务器架构是全球互联网行业中备受关注的焦点,作为一个高性能的集群系统,它承载着海量的数据处理任务。本文将深入探讨Facebook的架构设计,从不同的角度解析其技术栈。 首先,Facebook的架构可以分为两...
React 是由 Facebook 开发的 JavaScript 库,主要用于构建用户界面,特别是单页应用(SPA)。而 Flux 是一个架构模式,旨在解决 React 应用中的数据流管理问题,提供了一种更有序的方式来处理应用程序的状态变化。 ...
Facebook的服务器架构是其能够支撑全球数十亿用户高效、稳定运行的关键。这个架构主要分为几个层次,每层都有特定的功能和优化目标。 首先,从技术栈的角度看,Facebook的架构可以分为LAMP(Linux、Apache、MySQL、...
【标题】"meteor-react-ionic-chat-2" 是一个基于 Meteor、React 和 Ionic 框架构建的聊天应用项目。这个项目的目的是创建一个实时、交互式的聊天平台,让用户能够进行实时沟通。 【描述】提到“聊天第2部分”,...
群聊 - React Flux 一个使用和令人敬畏的架构的应用程序。如何使用 ? 从根项目目录从命令行运行这些命令: npm install 这将安装所有依赖项。 要构建项目,请运行以下命令: gulp 这将创建一个dist目录,然后你必须...
Flux是Facebook提出的一种架构设计模式,常用于构建用户界面,尤其是大型的、单页面应用(SPA)。这个项目可能是为了帮助开发者理解Flux架构以及在HTTP上下文中如何应用。 首先,我们来深入了解Flux架构。Flux强调...
"health-video-chat"项目是一个基于Web的医疗保健视频聊天应用,它允许医生和患者通过安全、可靠的通信方式进行面对面的远程咨询。此应用的核心技术栈包括React、Python、Django、TypeScript以及WebRTC,同时也利用...
标题“chat-react-flux-coffee”表明这是一个关于使用React、Flux架构以及CoffeeScript进行聊天应用开发的项目。这个项目可能是为了帮助开发者实践和理解这三个技术的集成与交互。 React是Facebook开发的一个...
该项目名为"project-kelompok-7-chatbot-",很可能是一个团队协作的成果,旨在开发一个聊天机器人。从描述来看,没有提供具体的技术细节或功能特性,因此我们将根据常见的聊天机器人开发实践来探讨可能涉及的知识点...
【标题】"socket-io-react-chat" 是一个使用 JavaScript 开发的实时聊天应用示例,它结合了 Socket.IO 和 React 框架。Socket.IO 是一个为实时应用提供双向通信的库,而 React 则是用于构建用户界面的前端库。 ...
3. **Simple-Chat-App架构** 这个简单的聊天应用可能包含以下几个核心组件: - 用户模块:用户注册、登录,可能通过Parse的用户服务实现。 - 聊天室模块:创建和加入聊天室,发送和接收消息,可能依赖于Parse的...
Chat-App的样式设计可能涉及到这些技术之一。 8. **实时通信**: - 要实现实时聊天功能,开发者可能使用WebSocket或其他推送技术,如Socket.IO,来实现实时消息传输。 9. **测试**: - 为了确保Chat-App的质量,...
GraphQL是Facebook在2015年推出的API查询语言,它允许客户端定义需要哪些数据,避免了过度或不足的数据传输问题。GraphQL通过单一端点提供服务,允许开发者以结构化的方式获取数据,提高了API效率和灵活性。 3. **...
【标题解析】:“amplify-chat”是一个使用AWS服务构建的聊天应用程序,它结合了React前端框架,以实现用户友好的交互和实时通信功能。"放大"在这里指的是使用AWS Amplify,这是一个由亚马逊Web Services(AWS)提供...
"cha-chat:使用 Socket.io 的聊天应用示例"是一个基于JavaScript技术栈的实时通信应用,主要利用了React作为前端框架,Flux作为数据管理架构,以及Socket.io作为实时通信库。下面将详细介绍这些关键技术点。 **...
Flux 是 Facebook 推出的一种用于构建用户界面的架构模式,主要用于解决在大型 JavaScript 应用中管理状态和数据流的复杂性。它强调单向数据流,使得应用程序的状态变化更为可预测和可控。在这个模式中,数据从...
总结来说,"chat-mess-wfire"是一个利用React和Firebase构建的多人聊天应用,它展现了现代Web开发中的前后端分离实践,以及无服务器架构的优势。通过学习和理解这个项目,开发者可以深入掌握React的状态管理和组件化...
- **用户接口**:用户可以通过网站、移动应用或消息平台(如Facebook Messenger)与Chatbot互动。 - **服务器端**:PHP脚本运行在服务器上,接收用户的输入,处理请求并生成回复。 - **NLP引擎**:可选集成第三方...