摘要:Facebook 的实时聊天架构每日可处理数十亿条消息。

作者 | shivang

译者 | 弯月,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:

在这篇文章中,我将讨论Facebook的实时聊天架构,该架构每天可以处理数十亿条的消息。

Facebook的实时聊天架构后台使用了哪些技术?技术栈包括哪些?系统采用了怎样的架构?像Facebook一般拥有如此大量用户的平台在推出和扩展实时聊天功能时,主要面临的难题有哪些?

下面就让我们一起来看看吧。

引言 

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

Facebook的工程师采纳了这个原型,然后将其发展成了全面的实时聊天功能,后来这就成了Facebook服务生态系统中使用最频繁的功能之一。

该聊天软件每天要处理全世界发送的数十亿条消息。社交平台的工程团队对其进行了良好地扩展,其响应时间不足100毫秒。

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

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

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

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

与集成第三方代码相比,从头编写聊天功能更容易、更清晰、更安全且可以提供更多控制。

实时聊天架构与技术栈

Facebook聊天软件的整个系统由几个松散耦合的模块组成,这些模块彼此协同工作,例如Web层、用户界面、聊天记录、用户上线模块和频道集群。

用户界面

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

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

该框架没有采用Flash的原因主要有两个:首先,使用Flash就会要求用户在浏览器中安装插件,这种用户体验不佳;其次,从安全角度来看,Flash不是首选。

消息获取流程采用了基于HTTP模型的PULL与PUSH相结合。

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

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

后台Web层

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

用户在线状态模块

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

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

频道服务器

频道服务器负责消息队列和传递。该功能采用Erlang编写。

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

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

频道服务器利用了Mochi Web库。这是一个用于构建轻量级HTTP服务器的Erlang库。用户发送的消息会送到频道服务器的队列中。每条消息都有一个序列号,可以保证两个或多个用户之间的同步通信。

聊天记录

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

服务的可扩展性和部署

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

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

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

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

资源密集度最高的操作

整个系统中资源密集度最高的操作不是发送数十亿条消息,而是让用户掌握朋友的在线状态。

这个功能非常重要,因为只有当一个人看到朋友在线才会开始对话。

为了实现这一点,一种选择是向用户发送朋友上线的通知。但考虑到Facebook平台的用户数量,这种实现方式没有可扩展性。

在最差的情况下,该操作的复杂度为O(用户的平均朋友数 * 流量高峰期的用户数 * 用户离线和重新上线的频率)个消息/秒。

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

此外,即便是没有聊天的用户通过后台的异步轮询获得朋友的活动状态也会给服务器带来巨大压力。

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

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

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

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

消息与存储的同步

如前所述,为了管理同步通信,每条消息都有一个序列号。

除此之外,Facebook还创建了一个Messenger同步协议,将非媒体数据使用量减少了40%。这减少了网络拥塞,并摆脱了由此引起的错误。

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

该队列具有不同的指针,可帮助跟踪用户已读的消息以及尚未处理的消息更新。

最近的消息由Iris的内存发送,旧的会话从普通的存储中获取。Iris建立在MySQL和闪存之上。

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

原文:https://www.8bitmen.com/facebook-real-time-chat-architecture-scaling-with-over-multi-billion-messages-daily/

本文为 CSDN 翻译,转载请注明来源出处。

人工智能如何学?

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw

【END】

 热 文 推 荐 

华为主导 5G 入网之争?

☞是时候“抛弃”谷歌 BERT 模型了!新型预训练语言模型问世

“对不起,我就是传说中的 10 倍工程师”

☞17 岁成为 iOS 越狱之父,25 岁造出无人车,黑客传奇!

☞抢程序员饭碗?自动写代码的Deep TabNine真如此神奇?

☞又是GAN!这个AI让周杰伦、罗永浩“变脸”古典画像

☞你硬盘里的那些电影都是如何被保存的?

☞孙宇晨深夜发文致歉: “我年轻, 涉世未深”……

中国第一程序员,微软得不到他就要毁了他!

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢

Facebook 实时聊天架构日均处理数十亿条消息!相关推荐

  1. 全球数十亿条用户记录被泄露,姓名住址全曝光,Oracle或已引发今年最大的数据安全事件...

    来源 | InfoQ 编译 | 核子可乐.Tina Oracle 的广告技术部门,因服务器处于不安全且未设置密码的状态,导致数据库中全球数十亿人的记录被泄露. Oracle 于 2014 年以超过 4 ...

  2. Facebook如何将QUIC应用于数十亿流量传输

    随着IETF很快完成QUIC标准定稿,越来越多的企业和开发者投入到QUIC开发实现与部署中.阿里巴巴实现了XQUIC:B站.快手在2019年就公开了QUIC的应用实践:Akamai等CDN服务商则很早 ...

  3. 美团点评业务之技术解密,日均请求数十亿次的容器平台

    http://www.infoq.com/cn/articles/technology-decryptionof-meitaun-services-review 本文介绍美团点评的 Docker 容器 ...

  4. 【云周刊】第124期:实时计算来临!阿里新一代实时计算引擎 Blink,每秒支持数十亿次计算

    摘要: 每秒支持数十亿次计算的计算引擎长啥样?阿里下一代数据库技术爆料!把数据库装入容器不再是神话!马云.阿里云和"云上贵州"又有着怎样的故事--更多精彩技术资讯,下滑查看吧! 本 ...

  5. 【云周刊】第124期:实时计算来临!阿里新一代实时计算引擎 Blink,每秒支持数十亿次计算...

    摘要: 每秒支持数十亿次计算的计算引擎长啥样?阿里下一代数据库技术爆料!把数据库装入容器不再是神话!马云.阿里云和"云上贵州"又有着怎样的故事--更多精彩技术资讯,下滑查看吧! 本 ...

  6. Facebook开源图嵌入“神器”:无需GPU,高效处理数十亿级实体图形 | 极客头条...

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 编译 | Major.一一 出品 | AI科技大本营(ID: rgznai100) 有效处理大规模图对于 ...

  7. 腾讯数十亿广告的基础是精准实时推荐

     专访腾讯数据平台部总经理蒋杰:腾讯数十亿广告的基础是精准实时推荐 虎嗅注:本文是福布斯中文网"数据大玩家"专栏中的一篇文章.接受提问的蒋杰先生,是腾讯数据平台部总经理,在加入 ...

  8. 《预训练周刊》第25期:HyperCLOVA:数十亿级韩语生成式预训练变换器、GPT-3在生物医学领域不是好的小样本学习器...

    No.25 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第25期&l ...

  9. 听见丨孙宏斌欲数十亿元增资乐视影业和乐视致新 百度发布AI智能硬件Raven H

    孙宏斌欲数十亿元增资乐视影业和乐视致新 腾讯财经<棱镜>从多个独立信源处获悉,融创中国主席孙宏斌已于近期启动了对乐视致新以及乐视影业增资扩股的计划,涉及金额高达数十亿元.知情人士对腾讯财经 ...

最新文章

  1. transition过渡规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezier(0.25,0.1,0.25,1))。...
  2. 互联网协议 — ICMP 互联网控制消息协议
  3. 出这样的题,出题人的良心确定不会痛吗?
  4. 同一解决方案内的多个项目之间如何引用?
  5. Java基础学习总结(73)——Java最新面试题汇总
  6. python内存的回收机制_python的内存管理和垃圾回收机制详解
  7. JS 全局函数 isNaN()、parseInt()、parseFloat()
  8. 计算机网络超详细笔记(二):物理层
  9. 大学生网页设计制作作业实例代码 (全网最全,建议收藏) HTML+CSS+JS
  10. 二次规划——学习笔记
  11. matlab接触封装,MATLAB如何解除封装
  12. 舱机器人尾巴毛茸茸_并无卵用的毛茸茸机器人 如此呆萌 设计是为了爱
  13. 获取必应每日壁纸(api)
  14. 年薪20万、50万、100万的算法工程师,到底有什么区别?
  15. 嵌入式Linux--U-Boot(三)Boot命令使用
  16. 区块链的未来:公链VS联盟链
  17. docker 根据镜像名称查找容器并删除
  18. 利用jieba分词分析小说三
  19. 学历代表过去,只有学习力才能代表将来,尊重经验的人,才能少走弯路
  20. 我的奇思妙想隐形的机器人_我的奇思妙想机器人作文

热门文章

  1. 《TensorFlow 2.0深度学习算法实战教材》学习笔记(二、回归问题和分类问题)
  2. 如何在矩池云GPU云中安装MATLAB R2017b软件
  3. pythontuple_python:tuple 真是鸡肋吗
  4. 剑指offer两个栈来实现一个队列
  5. 中国双槽超声波清洗机市场趋势报告、技术动态创新及市场预测
  6. 2021-2025年中国窗帘行业市场供需与战略研究报告
  7. input 模糊匹配功能 文本框模糊匹配(纯html+jquery简单实现) demo
  8. 火热的 Web 3,究竟离我们有多远?
  9. 历史上的今天:ATT 成立;全球最大分布式计算项目正式停止;家酿俱乐部首次会议...
  10. 如何用一行 CSS 实现 10 种现代布局?