BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 谢丽 关注 11 他的粉丝 发布于 2014年10月25日. 估计阅读时间: 3 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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)关注我们,并与我们的编辑和其他读者朋友交流。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT