写点什么

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

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

关注

评论

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

Kubernetes 跨集群流量调度实战 :访问控制

Flomesh

Service Mesh 服务网格 服务网格

一文教会你mock(Mockito和PowerMock双剑合璧)

京东科技开发者

测试 powermock Mock pom 企业号 1 月 PK 榜

Java高手速成 | 数据库实训:图书馆管理系统建模

TiAmo

数据库 管理系统 1月月更

看透react源码之感受react的进化

flyzz177

React

详解UDS CAN诊断:SecurityAccess Service(SID:0X27)

不脱发的程序猿

汽车电子 CAN ISO 14229 诊断和通信管理功能单元 SecurityAccess Service

React源码分析(一)Fiber

flyzz177

React

5A原则

穿过生命散发芬芳

1月月更

2022年人民满意手机银行服务白皮书

易观分析

金融 白皮书 手机银行 用户

ChatGPT 最近火得不要不要的

HoneyMoose

ChatGPT 使用 API 进行 Postman 调用测试

HoneyMoose

k8s 学习实战(一)

AiDaddy

k8s安装 kubenetes

群晖NAS设置Calibre个人电子图书馆

刘旭东

群晖 Calibre 个人图书

属于 PingCAP 用户和开发者的 2022 年度记忆

PingCAP

#TiDB

SPL 实现电力高频时序数据实时存储统计

石臻臻的杂货铺

SPL

2022年11月中国网约车领域月度观察

易观分析

网约车 行业 打车

谈谈你在面试中遇到的一面、二面、三面有什么区别?

风铃架构日知录

Java java面试 程序员面试 面试‘’ 面试流程

每个人都必须为2023年的十大基本技术趋势做好准备

超自动化

AI 超自动化

国内首款支持gRPC+WebSocket调试的工具——Apipost

不想敲代码

从源码角度看React-Hydrate原理

flyzz177

React

React-Hooks源码深度解读

flyzz177

React

2023-01-04:有三个题库A、B、C,每个题库均有n道题目,且题目都是从1到n进行编号 每个题目都有一个难度值 题库A中第i个题目的难度为ai 题库B中第i个题目的难度为bi 题库C中第i个题目

福大大架构师每日一题

算法 rust Solidity 福大大

从recat源码角度看setState流程

flyzz177

React

小心被坑死!如果你还在用 Zookeeper 做注册中心

风铃架构日知录

Java zookeeper 程序人生 后端 注册中心

链上隐私交易成新刚需,Unijoin.io或成该赛道新契机

股市老人

《解构领域驱动设计》-软件复杂度解析

珑彧

读书笔记 方法论 领域驱动设计 DDD 复杂

TableLayout(表格布局)

芯动大师

Android Studio tablelayout 表格布局

2022年中国证券类APP创新专题分析

易观分析

金融 证券 证券app

深入react源码看setState究竟做了什么?

flyzz177

React

Reids的BigKey和HotKey

小小怪下士

Java redis 程序员

4天带你上手HarmonyOS ArkUI开发——《HarmonyOS ArkUI入门训练营之健康生活实战》

HarmonyOS开发者

HarmonyOS

LiveMe x TiDB丨单表数据量 39 亿条,简化架构新体验

PingCAP

#TiDB

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