《即时消息技术剖析与实战》学习笔记9——IM系统如何支持消息的多终端漫游

1、什么是多终端漫游

多终端漫游是指:用户在任意一个设备登陆后,都能获取到历史的聊天记录。如:QQ 默认漫游 7 天的聊天记录,开通 VIP 会员可漫游 30 天,开通 SVIP 会员可漫游 2 年。服务器

2、多终端漫游的实现

支持消息多终端漫游通常须要两个条件:网络

  • 设备在线状态
  • 离线消息存储
1. 经过设备的在线状态来实现

记录设备的在线状态,当用户在多个终端同时登陆并发送消息时,IM 服务端将收到的消息推给接收方的多台在线设备,同时推给发送方的其余登陆设备。

能够看到,当多终端同时在线,只须要维护设备的在线状态就能够了。并发

2. 经过离线消息存储来实现

上面的图是假设接收方或发送方的多台终端设备都是在线状态,若发送方或接收方用户的多台终端设备中,某些设备是离线状态,此时发送消息,IM 服务端只会将消息推送给在线设备,同时将消息存储到服务器,以便离线设备上线后同步历史消息。
学习

  • 离线消息的同步机制

用户的某台离线设备上线后,须要知道获取哪些离线消息,通常采用版本号实现多终端和服务端的数据同步,保证离线消息能够作到按需拉取。

同步流程如图所示:
① 当有消息须要推送给用户时,会为每条消息生成一个版本号,并连同消息存入离线存储中,同时更新服务端维护的接收方用户的最新版本号,并将只携带版本号的消息发送给发送方设备,使发送方设备的最新版本号和服务端同步。
② 接收方的在线设备接收到消息后,更新本地的最新版本号为收到的最后一条消息的版本号。
③ 当接收方的离线设备上线时,会提交本地最新版本号到服务端,服务端比对服务端维护的该用户的最新版本号和客户端提交上来的版本号,如不一致,服务端会根据客户端的版本号从离线存储获取“比客户端版本号新”的消息,并推送给新上线的客户端。code

  • 离线消息的存储

离线消息的存储,不只包括消息内容自己,还须要存储一些操做(删除、撤销等)的信令。好比:用户 A 在一台已上线的设备删除/撤销了某条发送给用户 B 的消息,这个操做的信令也会和消息一块儿存储起来,这样当用户 A 的另外一台离线设备上线时,就不会同步这个已删除/撤销的消息。blog

因此存储离线消息时,会存储消息内容、操做信令、消息对应的版本号。同步

  • 离线消息的淘汰机制

离线消息的存储成本比较高,由于不知道用户有几个设备,也不知道用户的离线设备多久上线,因此离线消息的存储通常会有时限和条数的限制,好比保留 1 周时间,最多存储 1000 条,若在保留时间内消息超过规定条数,在不超过大小限制和时效限制的前提下,采用 FIFO(先进先出) 的淘汰机制,这样用户的离线设备若是某一天上线,只会同步最近一周的历史记录,也可能消息超过保留时间反而什么都没同步哦🤷‍♀️登录

  • 消息打包下推和压缩

对于较长时间不上线的用户,上线后须要拉取的离线消息比较多,若是一条一条下推会致使整个过程很长,客户端看到的就是一条一条消息蹦出来,体验会不好。所以,针对离线消息的下推会采用总体打包、压缩推送的方式来把多条消息合并成一个大包推下去,不只能减小网络传输时间,还能节省用户的流量消耗。实现上能够经过 header 标识告知客户端这是一个压缩过的打包消息,客户端收到后解压便可。打包

后记

这篇文章学完后,感受有不少不明白的地方,但看完精选留言后又茅塞顿开,仍是要多学习、多思考。终端

相关文章
相关标签/搜索