消息同步:在Airbnb我们是怎样扩展移动消息的
随着从移动端发出的消息条数超过每小时 100k,消息传递成为了 Airbnb 应用中被使用得最频繁的功能,但是我们之前用在移动版收件箱中获取消息的方法缓慢且不能保证数据的一致性,必须要有网络连接才能阅读消息。这些原因导致了移动版收件箱的房东和游客的体验都不太好。为了让收件箱更快、更可靠、更一致,我们在 Airbnb 中构建了消息同步机制。
旧版收件箱的实现方式类似于上世纪末的邮箱客户端,用户每点击一次,就网络加载一次,从而获取需要展示的消息。通过消息同步,只有当数据改变时才会更新消息内容和消息列表,从而大大减少了网络请求的数量。这意味着在收件箱和消息列表之间来回切换导航的速度快了很多,大部分时间都是用本地缓存来展示数据,而不再需要在进入每个界面的时候都发起网络请求。消息同步还减少了每个网络请求的响应大小,从而使 API 的响应速度提升了两倍之多。这些体验优化在网速较慢的地区尤为明显。
以下为消息同步的工作方式,分三种情况:
情景 1: 全幅增量更新
常见的情景是这样的:



- 移动客户端使用本地存储的
sequence_id
(比如 1490000000,表示客户端上一次与服务器同步的时间)请求同步。 - API 服务器只返回所有已修改的消息对象和新的消息并附带一个新的
sequence_id
(比如 1491111111)。 - 移动客户端将这些被修改的消息和新的消息和本地数据库合并。
- 移动客户端还要存储新的
sequence_id
以供下次使用。

- 移动客户端使用本地存储的
sequene_id
来调用同步 API。 - API 服务器估计完全增量同步的响应体大小,并且判断觉得它太大了。
- API 服务器仅返回最新 N 个会话对象,足够客户端渲染整个屏幕而没有空白。
- 客户端清除本地的数据库。
- 客户端存储最新的消息和
sequence_id
。 - 当用户打开会话时,客户端会向服务器请求这个会话的所有消息。
- 当用户在收件箱中浏览历史记录时,客户端会发送分页请求来获取会话的消息。
回归测试
当迁移到新的消息同步 API 的时候,有几个需要注意的点:- Airbnb 的消息系统与核心的预定流程及其它产品逻辑紧密结合。服务器需要监听那些会影响数据在屏幕上显示的变动。比如当行程完成后,应用需要在会话中显示「评价」按钮。我们当时有两种方案可选:一个是在阅读消息的时候检查评论对象是否被修改;另一个是订阅评论对象的状态并在下一次读取会话消息的时候改变它。我们选择了第二种方案,因为这种方案节省资源。但是,监控这些能影响 UI 改变的对象,是一个挑战。
- 更新后的会话可能和本地存储的会话有不同的顺序。我们需要确保在合并数据后能够正确的刷新 UI。
结论
- 消息同步 API 将请求的延迟减少了一半。相对于旧的API(下面突出的蓝线),新的API的网络请求更加稳定。

- 消息同步使用户能够在飞行模式或者网络状况不佳的情况下阅读消息。
- 原文地址:Messaging Sync — Scaling Mobile Messaging at Airbnb
- 原文作者:Zhiyao Wang, Michelle Leon , Jason Goodman , Nick Reynolds , Julia Fu , Jeff Hodnett , Manuel Deschamps , John Pottebaum, Charlie Jiang
- 译文出自:掘金翻译计划
- 译者:Tuccuay
- 校对者:ZhangRuixiang , zhangqippp
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 在青春的赛道上奋力奔跑 7904500
- 2 上海欢乐谷失火 游客:还以为是表演 7809371
- 3 灵隐寺8.5平米小卖部年租金260万 7713433
- 4 这些景点已限流别跑空 7618014
- 5 五一高速上演“人在囧途” 7524111
- 6 西安夜空不明黑影 气象台:无法解释 7426309
- 7 邓超:备战明年斯诺克 7332698
- 8 安徽一机关食堂五菜一汤仅10元 7235571
- 9 加州州长:我们不是美国 7142501
- 10 年轻朋友的样子是中国未来的样子 7046794