NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

Facebook Messenger 弃用拉模式,改用基于推模式的快照 - 增量模型

  • 2014-10-24
  • 本文字数:1045 字

    阅读完需:约 3 分钟

Facebook Messenger 是 Facebook 官方发布的即时聊天应用,类似于手机短信应用,允许用户在手机上向 Facebook 上或者手机通讯录中的好友免费发送信息。去年开始,Facebook 尝试为 Messenger 构建“移动优先(Mobile First)”的用户体验。近日,Facebook 官方博客发表了一篇文章,介绍他们的新同步协议及效果。

客户端

在原先的协议中,Messenger 通过拉模式获取数据。当有新消息时,它首先会收到一条有新数据可用的通知。之后,它会向服务器发送一个复杂的HTTPS 查询请求,并接收一个很大的JSON 响应。

在新协议中,Facebook 改用一种基于推模式的快照- 增量模型。在这个模型中,客户端会首先检索一个消息快照,然后订阅增量更新。当有新消息时,客户端会接收到通过 MQTT 协议推送的增量更新。这样,它无需再次发起 HTTPS 请求,就可以快速展示最新的消息视图。

此外,他们认为,用 JSON 格式在线传递消息及增量更新不够高效,于是便用 Thrift 代替了 JSON。这使其网络有效负载降低了大约 50%。

服务器端

通常,消息数据都存储在旋转磁盘上。在拉模式中,在通知 Messenger 发送查询请求从磁盘读取数据之前,要先将数据写入磁盘。这样,同一个存储层既要存储实时消息又要存储完整的对话历史。这种方式无法满足新开发的同步协议。他们需要将同样的更新序列以用户为单位实时并行地发送到 Messenger 应用和存储层。

于是,他们开发了 Iris。这是一个消息更新的全序队列,它有两个单独的指针,分别指向最近发送给 Messenger 应用的更新和最近发送到传统存储层的更新。当消息成功发送到手机或磁盘时,相应的指针就会向前移动。当手机离线时,相应的指针就会停在原处,而新消息仍然可以进入队列,其它指针正常移动,反之亦然。这样,Messenger 应用和传统存储层就能以各自的速率进行同步,互不影响。

实际上,该队列基于时间实现了一个三层存储模型:

  • 最新消息从 Iris 的内存立即发送给 Messenger 应用和磁盘存储层
  • 一周内的消息存储在队列的后台存储中
  • 更早的对话历史和完整的收件箱快照则由传统磁盘存储层提供

另外,在综合考虑了扩展性、可靠性、速度和灵活性后,他们最终选择基于 MySQL 和闪存实现了 Iris 的后台存储,并使用了 MySQL 的半同步复制功能。

效果

新同步协议使非媒体数据减少了 40%。而通过减少网络阻塞,用户消息发送失败的情况减少了大约 20%。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-10-24 01:423660
用户头像

发布了 1008 篇内容, 共 374.7 次阅读, 收获喜欢 341 次。

关注

评论

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

“穿越”到虚拟世界笑风生,网易瑶台沉浸式活动平台创新云端活动体验

阿里云弹性计算

虚拟世界 GPU服务器 瑶台

数据建模

奔向架构师

数据仓库 数据建模 7月月更

小程序表单-3

小恺

7月月更

解读《深入理解计算机系统(CSAPP)》第10章系统级IO

小明Java问道之路

unix 文件管理 csapp 7月月更 系统级IO

浅入浅出mybatis(四)

ES_her0

7月月更

Istio Mesh模型

阿泽🧸

7月月更 Istio Mesh

Java方法重载及递归

未见花闻

7月月更

混合办公-疫情之下,远程办公靠谱吗?

WorkPlus

Flutter 来一个笑嘻嘻的动态表情

岛上码农

flutter ios 前端 安卓开发 7月月更

长安链研究笔记-数据存储

长安链

「势说新语」浅谈软件许可证

安势信息

开源 软件 许可证 开源软件 开源软件供应链

IPv6大航海,风帆指向强应用

脑极体

实习过后的人都怎么样了?

KEY.L

7月月更

移动互联网未来发展的五大趋势

WorkPlus

实践丨手把手教你用STM32设计WiFi语音播报日程表

华为云开发者联盟

开发

AWS Inspector

冯亮

云计算 DevOps security AWS

【刷题记录】10. 正则表达式匹配

WangNing

7月月更

Python爬虫抢购某宝秒杀商品

弑着去忘记う

Python

必须掌握的CSS三大特性🎨

猪痞恶霸

前端 7月月更

究竟谁更需要已读功能?用户还是即时通讯本身?

WorkPlus

KubeEdge Summit 2022首日亮点 | 全球产学研齐聚一堂,共话边缘新未来

华为云原生团队

云原生 边缘计算 kubeedge 边缘AI IOT设备管理

实时视频在弱网下的极限通信

Damon

7月月更

新星计划Day7【数据结构与算法】 栈Part1

京与旧铺

7月月更

LaTex笔记(Windowns)

乌龟哥哥

7月月更

SENSORO智慧社区服务方案:抓住基层治理的“神经末梢”

SENSORO

物联网

微信业务架构图&“学生管理系统”毕设架构设计

gump

架构实战营

Typora常用语法和md样式美化一本通

武师叔

7月月更

容器应用发布三大方案

穿过生命散发芬芳

容器应用 7月月更

leetcode 435. Non-overlapping Intervals 无重叠区间(中等)

okokabcd

LeetCode 数据结构与算法 贪心算法

【Docker 那些事儿】容器数据卷的本手

Albert Edison

Docker Kubernetes 容器 云原生 7月月更

赛博女娲,怎么造数字人?

脑极体

Facebook Messenger弃用拉模式,改用基于推模式的快照-增量模型_Meta_谢丽_InfoQ精选文章