写点什么

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

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

关注

评论

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

高级滤镜效果:Topaz Photo AI Mac电脑版

真大的脸盆

Mac Mac 软件 图像编辑处理 图像优化工具

vivo积分任务体系的架构演进-平台产品系列05

vivo互联网技术

架构演进 积分 任务体系

程序员必知必会!阿里内部热捧“Spring全线笔记”太完整了

程序知音

Java spring java架构 Java进阶 后端技术

RocketMQ消费者是如何负载均衡的

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 5 月 PK 榜

“前端”工匠系列(一):合格的工匠,究竟该搞什么 | 京东云技术团队

京东科技开发者

前端 编码格式 Vue 3 企业号 5 月 PK 榜

Web前端已死?别带节奏了,说白了就是“卷”

引迈信息

前端 大前端 低代码 java 并发 JNPF

面向万物智联的应用框架的思考和探索(中)

HarmonyOS开发者

限量!腾讯高工用4部分讲清楚了Spring全家桶+微服务

Java spring 微服务 Spring Cloud Spring Boot

解密Elasticsearch:深入探究这款搜索和分析引擎 | 京东云技术团队

京东科技开发者

elasticsearch redis 底层原理 企业号 5 月 PK 榜 画像系统

腾讯云大佬亲码“redis深度笔记”无废话全精华!

程序知音

Java 数据库 redis Java进阶 后端技术

深扒!阿里人用6部分讲完Java性能调优:多线程+设计模式+数据库

Java 性能优化 性能调优

牛掰!阿里人用7部分讲明白百亿级高并发系统(全彩版小册开源)

Java 系统设计 高并发

人工智能大模型这场游戏才刚刚开始吗?还是在走下坡路? | 社区征文

迷彩

AI大模型 大模型时代 三周年征文 三周年连更

瓴羊Quick BI工具重建企业数字体系,数据处理不再难

巷子

一起单测引起的项目加载失败惨案 | 京东云技术团队

京东科技开发者

spring 单元测试 bean 企业号 5 月 PK 榜 Javaassist

新手必看|StarRocks 入门教程来啦!

StarRocks

数据库 大数据 数据湖 OLAP 数仓

Matlab实现深度学习

袁袁袁袁满

三周年连更

瓴羊Quick BI工具助力企业,数据处理效率翻番!

夏日星河

FFmpeg从入门到精通-云享读书会总结

DS小龙哥

三周年连更

探究Spring中Bean的线程安全性问题

Java spring 线程安全 bean

手把手教会你 | 多用户-服务器聊天室应用软件开发

TiAmo

多线程并发 数据库编程 服务器聊天室

java 中为什么有了 spring 还再来个 springboot?

海拥(haiyong.site)

三周年连更

三顾茅庐,七面阿里,终拿25k*16offer,我的面试历程

程序知音

Java 后端 java面试 Java进阶 Java面试八股文

细节!3部分讲明白HotSpot:运行时+编译器+垃圾回收器

Java JVM 虚拟机 hotspot

IDP中的黄金路径究竟是什么?

SEAL安全

IdP 平台工程 内部开发者平台 企业号 5 月 PK 榜 黄金路径

火山引擎DataTester上线全新MAB智能调优实验

字节跳动数据平台

AB testing实战 A/B测试 企业号 5 月 PK 榜

最高可达4000万元!浙江台州|台州市“500精英计划”引才政策申报

科兴未来News

Java泛型详解

timerring

Java

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