写点什么

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

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

关注

评论

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

架构师训练营第七周作业

张明森

Golang实现结构体数组按多字段排序

卓丁

多字段排序 结构体多字段排序 Go 语言

Prometheus 删除指定 Metric

耳东@Erdong

Prometheus metrics

Windows Sandbox应用

Dare Devor

容器 Sandbox 虚拟化

Vagrant 创建多台主机

FeiLong

vagrant 虚拟机

第七章作业

小胖子

道德的神

多选参数

故事

ARTS打卡-07

Geek_yansheng25

架构师训练营 - 第 6 周命题作业

红了哟

罪羊树——暴力也是种优雅

烫烫烫个喵啊

算法 二叉树 替罪羊 平衡二叉树

Go: 通过例子学习 Map 的设计 — Part I

陈思敏捷

map Go 语言

redis系列之——事物及乐观锁

诸葛小猿

redis 乐观锁 事物 原子性 隔离性

我关闭了微信朋友圈广告!

诸葛小猿

广告 微信朋友圈 关闭

发布一本用 GitBook 编辑的书

耳东@Erdong

git gitbook

架构师训练营 - 第 6 周学习总结

红了哟

Java中生成随机数的不同方法

wjchenge

web 性能压测工具类

jason

思想无语言边界:以cglib介绍AOP在java的一个实现方式

八苦-瞿昙

随笔 随笔杂谈 aop

谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么 ,什么是宏任务,什么是微任务?

GKNick

从推特被黑看安全木桶效应

石君

安全设计 安全事件

架构师课程第七周 作业

杉松壁

计算机网络基础(六)---网络层-网络地址转换NAT技术

书旅

laravel 计算机网络 网络协议 计算机基础 NAT

关于性能优化的总结

罗亮

多问为什么

声远

技术 沟通 软件开发流程

用 GitBook 创建一本书

耳东@Erdong

git markdown gitbook

JDK1.8新特性(四):函数式接口

xcbeyond

新特性 函数式编程 JDK1.8 JDK1.8新特性

运行 client-go 测试用例.md

FeiLong

Kubernetes

JDK1.8新特性(三):Lambda表达式,让你爱不释手

xcbeyond

Lambda 新特性 JDK1.8 JDK1.8新特性

架构师训练营第七周学习总结

张明森

架构师训练营第七周作业--web压测工具

CATTY

JDK1.8新特性(二):为什么要关注JDK1.8

xcbeyond

新特性 JDK1.8 JDK1.8新特性

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