Facebook 实时聊天架构日均处理数十亿条消息

国际新闻 阅读(818)

CSDN

摘要:Facebook新闻。

作者| shivang

翻译|新月,编辑|郭伟

制作| CSDN(ID:CSDNnews)

以下是翻译:

信息。

Facebook的实时聊天架构使用了哪些技术?什么是技术堆栈?系统使用什么样的架构?在启动和扩展实时聊天功能时,拥有如此众多用户的Facebook类平台面临的主要挑战是什么?

我们来看看下面的内容。

引言

这一切都始于一个黑客马拉松,当时一群Facebook工程师编写了聊天软件的原型并在他们的团队面前展示了它。虽然只有最基本的功能,但是可以在网页上拖动浮动聊天框,即使页面被重新加载并移动到其他页面,仍然会显示聊天框。

Facebook工程师采用了原型,然后将其开发成一个全面的实时聊天功能,后来成为Facebook服务生态系统中最常用的功能之一。

信息。社交平台的工程团队扩展得很好,响应时间小于100毫秒。

该功能不断得到改进,其唯一目的是为用户提供一流的通信服务。

为什么要从头开始编写和维护聊天?为什么不集成第三方聊天服务?

除了基本的聊天功能外,Facebook的聊天模块还集成了社交图谱。用户可以轻松获得他们的朋友列表以及其他相关信息,例如他们正在播放的游戏和他们正在浏览的内容。

通常,还可以在聊天模块上?梦势教ㄉ嫌没Э捎玫乃行畔ⅰ?

从头开始编写聊天比集成第三方代码更容易,更清晰,更安全,并提供更多控制。

实时聊天架构和技术堆栈

整个Facebook聊天软件系统由几个松散耦合的模块组成,这些模块可以协同工作,例如Web层,用户界面,聊天日志,用户启动模块和通道集群。

用户界面

用户界面自然是用JavaScript编写的,PHP也用于服务器端渲染。

通过Ajax在客户端和服务器之间建立长期持久连接。

框架不使用Flash有两个主要原因:首先,使用Flash将要求用户在浏览器中安装插件,这不是一个好的用户体验。其次,从安全角度来看,Flash并不是首选。

消息获取过程使用基于HTTP模型的PULL和PUSH的组合。

最初,客户端需要发送PULL请求以获取消息的第一个快照,然后执行订阅操作(这是基于PUSH的方法)。

用户订阅更新后,只要有新的更新,Facebook后台就会将更新推送到客户端。

背景网络层

Web层由PHP提供,并处理Web请求本身。负责用户身份验证,朋友隐私设置,聊天记录,朋友更新以及其他平台功能业务逻辑。

用户在线状态模块

该模块为用户和朋友提供在线信息。该模块是用C ++编写的,是系统中最常用的模块。

该模块聚合内存中用户的在线信息,并在请求时将信息发送给客户端。

频道服务器

通道服务器负责消息队列和传递。此功能是用Erlang编写的。

Erlang是一种并发的函数式编程语言,用于编写即时消息,金融技术和在线电话等实时可扩展和高可用性系统。

Erlang的运行时系统内置了对并发,分发和容错的支持。

频道服务器利用Mochi消息具有保证两个或更多用户之间的同步通信的序列号。

聊天记录

聊天记录模块可以记录聊天的元数据以及其他信息。该模块使用C ++编写,用于在UI页面加载之间记录信息。

服务可扩展性和部署

Facebook的所有数据中心都拥有用户在线和聊天记录数据的副本,而频道服务器数据仅存储在专用数据中心,以确保强大的消息一致性。

如上图所示,所有后台模块都松散耦合,每个模块通过Thrift相互通信。

Thrift是一种通信协议,可用于在异构技术上运行的服务之间进行通信。

它是Facebook内部开发的服务通信的序列化和RPC框架,可帮助运行在C ++,Erlang,PHP和JavaScript上的系统作为一个团队协同工作。

资源最密集的操作

消息是让用户知道朋友的在线状态。

此功能非常重要,因为只有当一个人在网上看到朋友时,他们才会开始说话。

为了实现这一点,一种选择是向用户发送该朋友在线的通知。但考虑到Facebook平台上的用户数量,此实现不具备可扩展性。

在最坏的情况下,操作的复杂性是O(用户的朋友的平均数量*峰值流量时段期间的用户数量*用户离线和重新联机的频率)消息/秒。

在高峰时段,Facebook网站上的并发用户数量是数百万。确保所有用户都拥有最新的在线信息在技术上是不可行的。

此外,即使没有聊天的用户也可以通过在后台通过异步轮询获取朋友的活动状态来对服务器施加很大压力。

为了实现可扩展的用户在线状态背景,通道服务器群集保留用户的在线状态,并通过定期批量更新将其发送到状态服务器。

这种方法的优点是只需一个查询就可以获得整个用户朋友列表。

考虑到模块之间交换的大量信息,通道服务器在将信息传输到状态服务器之前压缩信息。

随着用户连接数量的增加,负载平衡器的数量也会增加。之后,基础架构管理并发用户连接的能力得到了显着提升。这是一个瓶颈,可能导致聊天服务在高峰时段中断。

消息和存储的同步

该消息有一个序列号。

此外,Facebook还创建了一种Messenger同步协议,可将非媒体数据使用量减少40%。这可以减少网络拥塞并使您免于产生错误。

Facebook的工程团队编写了一项名为Iris的服务,该服务在有序队列中组织消息更新。

此队列具有不同的指针,以帮助跟踪用户已读取的消息和尚未处理的消息。

最新消息由Iris的内存发送,旧会话取自正常存储。 Iris建立在MySQL和flash之上。

最初,消息存储使用Hbase,但后来移到了MyRocks。这是一个由Facebook开发的开源数据库项目,其中RocksDB作为MySQL存储引擎。

原文:

本文翻译为CSDN,请注明出处。

【END】

热门文字推荐

?华为引领5G网络纠纷?

是时候“放弃”Google BERT模型了!可以使用新的预训练语言模型

“对不起,我是传奇的10次工程师”

17岁成为iOS越狱之父,25岁做了无人驾驶汽车,黑客传奇!

?抓住程序员的饭碗? Deep TabNine是否会自动编写如此令人惊奇的代码?

?甘!这个AI让周杰伦和罗永浩“变脸”的经典肖像

如何保存硬盘上的电影?

孙雨辰深夜道歉:“我年轻,没有深入参与”.

第一个中国程序员,微软不会摧毁他,如果他不能得到他!

你看到的每一点,“我在看,”我认真地成为了一个最喜欢的

摘要:Facebook新闻。

作者| shivang

翻译|新月,编辑|郭伟

制作| CSDN(ID:CSDNnews)

以下是翻译:

信息。

Facebook的实时聊天架构使用了哪些技术?什么是技术堆栈?系统使用什么样的架构?在启动和扩展实时聊天功能时,拥有如此众多用户的Facebook类平台面临的主要挑战是什么?

我们来看看下面的内容。

引言

这一切都始于一个黑客马拉松,当时一群Facebook工程师编写了聊天软件的原型并在他们的团队面前展示了它。虽然只有最基本的功能,但是可以在网页上拖动浮动聊天框,即使页面被重新加载并移动到其他页面,仍然会显示聊天框。

Facebook工程师采用了原型,然后将其开发成一个全面的实时聊天功能,后来成为Facebook服务生态系统中最常用的功能之一。

信息。社交平台的工程团队扩展得很好,响应时间小于100毫秒。

该功能不断得到改进,其唯一目的是为用户提供一流的通信服务。

为什么要从头开始编写和维护聊天?为什么不集成第三方聊天服务?

除了基本的聊天功能外,Facebook的聊天模块还集成了社交图谱。用户可以轻松获得他们的朋友列表以及其他相关信息,例如他们正在播放的游戏和他们正在浏览的内容。

通常,还可以在聊天模块上访问平台上用户可用的所有信息。

从头开始编写聊天比集成第三方代码更容易,更清晰,更安全,并提供更多控制。

实时聊天架构和技术堆栈

整个Facebook聊天软件系统由几个松散耦合的模块组成,这些模块可以协同工作,例如Web层,用户界面,聊天日志,用户启动模块和通道集群。

用户界面

用户界面自然是用JavaScript编写的,PHP也用于服务器端渲染。

通过Ajax在客户端和服务器之间建立长期持久连接。

框架不使用Flash有两个主要原因:首先,使用Flash将要求用户在浏览器中安装插件,这不是一个好的用户体验。其次,从安全角度来看,Flash并不是首选。

消息获取过程使用基于HTTP模型的PULL和PUSH的组合。

最初,客户端需要发送PULL请求以获取消息的第一个快照,然后执行订阅操作(这是基于PUSH的方法)。

用户订阅更新后,只要有新的更新,Facebook后台就会将更新推送到客户端。

背景网络层

Web层由PHP提供,并处理Web请求本身。负责用户身份验证,朋友隐私设置,聊天记录,朋友更新以及其他平台功能业务逻辑。

用户在线状态模块

该模块为用户和朋友提供在线信息。该模块是用C ++编写的,是系统中最常用的模块。

该模块聚合内存中用户的在线信息,并在请求时将信息发送给客户端。

频道服务器

通道服务器负责消息队列和传递。此功能是用Erlang编写的。

Erlang是一种并发的函数式编程语言,用于编写即时消息,金融技术和在线电话等实时可扩展和高可用性系统。

Erlang的运行时系统内置了对并发,分发和容错的支持。

频道服务器利用Mochi消息具有保证两个或更多用户之间的同步通信的序列号。

聊天记录

聊天记录模块可以记录聊天的元数据以及其他信息。该模块使用C ++编写,用于在UI页面加载之间记录信息。

服务可扩展性和部署

Facebook的所有数据中心都拥有用户在线和聊天记录数据的副本,而频道服务器数据仅存储在专用数据中心,以确保强大的消息一致性。

如上图所示,所有后台模块都松散耦合,每个模块通过Thrift相互通信。

Thrift是一种通信协议,可用于在异构技术上运行的服务之间进行通信。

它是Facebook内部开发的服务通信的序列化和RPC框架,可帮助运行在C ++,Erlang,PHP和JavaScript上的系统作为一个团队协同工作。

资源最密集的操作

消息是让用户知道朋友的在线状态。

此功能非常重要,因为只有当一个人在网上看到朋友时,他们才会开始说话。

为了实现这一点,一种选择是向用户发送该朋友在线的通知。但考虑到Facebook平台上的用户数量,此实现不具备可扩展性。

在最坏的情况下,操作的复杂性是O(用户的朋友的平均数量*峰值流量时段期间的用户数量*用户离线和重新联机的频率)消息/秒。

在高峰时段,Facebook网站上的并发用户数量是数百万。确保所有用户都拥有最新的在线信息在技术上是不可行的。

此外,即使没有聊天的用户也可以通过在后台通过异步轮询获取朋友的活动状态来对服务器施加很大压力。

为了实现可扩展的用户在线状态背景,通道服务器群集保留用户的在线状态,并通过定期批量更新将其发送到状态服务器。

这种方法的优点是只需一个查询就可以获得整个用户朋友列表。

考虑到模块之间交换的大量信息,通道服务器在将信息传输到状态服务器之前压缩信息。

随着用户连接数量的增加,负载平衡器的数量也会增加。之后,基础架构管理并发用户连接的能力得到了显着提升。这是一个瓶颈,可能导致聊天服务在高峰时段中断。

消息和存储的同步

该消息有一个序列号。

此外,Facebook还创建了一种Messenger同步协议,可将非媒体数据使用量减少40%。这可以减少网络拥塞并使您免于产生错误。

Facebook的工程团队编写了一项名为Iris的服务,该服务在有序队列中组织消息更新。

此队列具有不同的指针,以帮助跟踪用户已读取的消息和尚未处理的消息。

最新消息由Iris的内存发送,旧会话取自正常存储。 Iris建立在MySQL和flash之上。

最初,消息存储使用Hbase,但后来移到了MyRocks。这是一个由Facebook开发的开源数据库项目,其中RocksDB作为MySQL存储引擎。

原文:

本文翻译为CSDN,请注明出处。

【END】

热门文字推荐

?华为引领5G网络纠纷?

是时候“放弃”Google BERT模型了!可以使用新的预训练语言模型

“对不起,我是传奇的10次工程师”

17岁成为iOS越狱之父,25岁做了无人驾驶汽车,黑客传奇!

?抓住程序员的饭碗? Deep TabNine是否会自动编写如此令人惊奇的代码?

?甘!这个AI让周杰伦和罗永浩“变脸”的经典肖像

如何保存硬盘上的电影?

孙雨辰深夜道歉:“我年轻,没有深入参与”.

第一个中国程序员,微软不会摧毁他,如果他不能得到他!

你看到的每一点,“我在看,”我认真地成为了一个最喜欢的