一、什么是多终端漫游

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

二、多终端漫游的实现

支持消息多终端漫游一般需要两个条件:

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

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

可以看到,当多终端同时在线,只需要维护设备的在线状态就可以了。

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

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

  • 离线消息的同步机制

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

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

  • 离线消息的存储

离线消息的存储,不仅包括消息内容本身,还需要存储一些操作(删除、撤销等)的信令。比如:用户 A 在一台已上线的设备删除/撤销了某条发送给用户 B 的消息,这个操作的信令也会和消息一起存储起来,这样当用户 A 的另一台离线设备上线时,就不会同步这个已删除/撤销的消息。

所以存储离线消息时,会存储消息内容、操作信令、消息对应的版本号。

  • 离线消息的淘汰机制

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

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

  1. 《即时消息技术剖析与实战》学习笔记4——IM系统如何保证消息的可靠性

    IM 系统中,保证消息的可靠投递主要体现在两方面,一是消息的不丢失,二是消息的不重复. 一.消息不丢失 消息丢失的原因 首先看一下发送消息的流程,如下图所示: 消息.可以采取"时间戳比对&q ...

  2. 《即时消息技术剖析与实战》学习笔记5——IM系统如何保证消息的一致性

    一.什么是消息一致性 消息一致性指的是消息的时序一致性,即消息收发的一致性.如果不能保证时序一致性,就会造成聊天语义不连贯,引起误会. 对于点对点的聊天场景,时序一致性保证接收方的接收顺序和发送方的发 ...

  3. 《即时消息技术剖析与实战》学习笔记1——IM系统的架构

    一.IM的应用场景 聊天.直播.在线客服.物联网等所有需要实时互动.高实时性的场景,都需要应用到 IM 技术.

  4. 《即时消息技术剖析与实战》学习笔记6——IM系统如何保证消息的安全性

    在消息产生.流转的各个环节中,需要保证消息传输安全性.消息存储安全性.消息内容安全性. 一.消息传输安全性 消息传输的重要防范点有两个,一是访问入口安全,二是传输链路安全. 1.HttpDNS保证访问 ...

  5. 《即时消息技术剖析与实战》学习笔记12——IM系统如何提升图片、音视频消息发送、浏览的体验

    IM系统如何提升用户发送.浏览图片和音视频消息的体验呢?一是保证图片.音视频消息发送得又快又稳,二是保证用户浏览播放图片.音视频消息时流畅不卡顿. 一.提升用户发送图片.音视频的体验 1. 多上传接入 ...

  6. 《即时消息技术剖析与实战》学习笔记3——IM系统如何保证消息的实时性

    IM 技术经历过几次迭代升级,如图所示: 从简单.低效的短轮询逐步升级到相对效率可控的长轮询: 全双工的 Websocket 彻底解决了服务端的推送问题: 基于 TCP 长连接衍生的 IM 协议,能够 ...

  7. 《即时消息技术剖析与实战》学习笔记11——IM系统如何保证服务高可用:流量控制和熔断机制

    IM 系统的不可用主要有以下两个原因: 一是无法预测突发流量,即使进行了服务拆分.自动扩容,但流量增长过快时,服务已经不可用了: 二是业务中依赖的这些接口.资源不可用或变慢时,比如发消息可能需要依赖& ...

  8. 《即时消息技术剖析与实战》学习笔记7——IM系统的消息未读

    一.什么是消息未读 消息未读包括会话未读和总未读.前者指的是当前用户和某一聊天方的未读消息数,后者指的是当前用户的所有未读消息数,也就是所有会话未读的和.比如用户A收到用户B的2条消息,还收到用户C的 ...

  9. 《即时消息技术剖析与实战》学习笔记8——IM系统如何保证长连接的可用性:心跳机制

    假设有以下突发意外情况: 用户进入信号不好的地方,手机没有网络信号了 上网的路由器突然掉线了 这个时候,比如微信发消息,消息就会转圈圈,甚至变成红色叹号-- 上面情况都会导致"长连接&quo ...

随机推荐

  1. slim中的参数获取

    官方文档中对于get和post的参数有以下获取方式 $app->get('/', function (Request $req, Response $res, $args = []) { $my ...

  2. CUBA 框架2019年回顾

    对于 CUBA 框架,2019年最重要的事件应该是 CUBA 7 的发布, 这是 CUBA 框架的一次巨大进化,CUBA 7 引入了一系列全新的 UI 和更灵活的数据访问机制,并且发布了基于 Inte ...

  3. 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

    目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...

  4. [梁山好汉说IT] 容器概念在北宋社会的应用

    [梁山好汉说IT] 容器概念在北宋社会的应用 0x00 摘要 如何对没有软件开发经验的人解释容器? 集装箱真的能够完美解释容器嘛? 除了集装箱还有其他常见实体能够解释容器嘛? 我找到了一个能够 和集装 ...

  5. 使用SonarQube+Eclipse来分析python代码

    背景 最近在项目中推广集成测试的理念以及相关工具,在jenkins中集成sonar去分析项目的java代码的时候,意外的发现,sonarqube上还有对应python的插件,而自己写的测试工具大部分都 ...

  6. centos服务器cpu百分之百,top查询不到之“-bash”

    把这条注释掉. [root@aaaa ~]# cat /etc/ld.so.preload #/usr/local/lib/libproc.so[root@aaaa ~]# 然后在top

  7. 1061 判断题 (15 分)C语言

    判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数和判断题数量.第二行给出 M ...

  8. javascript-void keyword

    javascript-void keyword 写在前面 ECMA-262定义了ECMAScript所支持的关键字(keyword),关键字不能用作ECMAScript程序的标识符(Indetifie ...

  9. 使用Rancher Server部署本地多节点K8S集群

    当我第一次开始我的Kubernetes之旅时,我一直在寻找一种设置本地部署环境的方式.很多人常常会使用minikube或microk8s,这两者非常适合新手在单节点集群环境下进行操作.但当我已经了解了 ...

  10. surging 社区版本支持.net core 3.1

    简介 surging 经过两年多的研发,微服务引擎已经略有雏形,也承蒙各位的厚爱, GitHub上收获了将近2800星,fork 811,付费用户企业也有十几家,还有咨询培训, 在2020年,我们将依 ...