QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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:423898
用户头像

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

关注

评论

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

React-hooks+TypeScript最佳实战

xiaofeng

React

分布式事务-两阶段提交协议(2PC)

zarmnosaj

10月月更

分割数组

掘金安东尼

算法 10月月更

React中常见的TypeScript定义实战

xiaofeng

React

企业上云选择哪家好?为什么?

行云管家

云计算 企业上云 云管理

为企业远程会议保驾护航,华为云会议安全更有保障!

科技之光

个promise

helloworld1024fd

JavaScript

支持随时随地一键开会,华为云会议场景适用性更强!

科技之光

React源码中的dom-diff

夏天的味道123

React

版本控制 | 游戏开发企业如何高效远程协作?

龙智—DevSecOps解决方案

版本控制 游戏开发 版本管理

js手写前端需要掌握的点

helloworld1024fd

JavaScript

前端食堂技术周刊第 56 期:Solid v1.6.0、2022 State of GraphQL、ViteConf 回放、Lerna v6、SEO 入门指南

童欧巴

嵌入式 Linux 入门(四、Linux 下的编辑器 — 让人爱恨交加的 vi )

矜辰所致

vim Linux VI 10月月更

RFO SIG:openEuler AWS AMI 制作详解

openEuler

Linux 开源 Kubernetes 云原生 AWS

1024,节日快乐

未来智安XDR SEC

BizWorks应⽤平台基于KubeVela的实践

阿里云E2企业云服务

阿里云 中台 插件 企业架构和云服务 api 网关

从零到一搭建一个属于自己的博客系统(弍)

木偶

MySQL django 前端 10月月更

代码质量与安全 | 关于糟糕代码的那些事

龙智—DevSecOps解决方案

代码质量 代码安全

TPU演进十年:Google的十大经验教训

OneFlow

人工智能 深度学习 TPU

鸿蒙开发实例 | 可复用列表项的ListContainer

TiAmo

华为 华为云 云开发 10月月更

C# 读取文件

青柚1943

如何规范App广告的隐私获取,让用户拥有更多知情权?

HarmonyOS SDK

广告sdk

二十年CRM市场跌宕起伏,Zoho选择“慢速”奔跑

ToB行业头条

代码质量与安全 | 入门必备:什么是自动化测试?

龙智—DevSecOps解决方案

代码质量 自动化测试 测试质量

MDAP:可观测性数据分析平台设计与实践

Shopee技术团队

数据分析 APM 性能 终端 数据监控

机器学习在基于 URL 的客户端监控分析中的优化和实践

Shopee技术团队

机器学习 数据分析 url 客户端 数据监控

什么是高可用?高可用软件哪家好?

行云管家

高可用 高并发 ha

云端协同,打造全场景智能会议,华为云会议更专业“会”更好

科技之光

华为云数据库 GaussDB(for MySQL),让企业无忧数据恢复

科技之光

1024程序员节开幕,龙蜥多位技术专家参与演讲

OpenAnolis小助手

开源 1024程序员节 龙蜥社区 技术分析 线上活动

React核心技术浅析

夏天的味道123

React

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