个人博客请访问 http://www.x0100.top

提问:什么是多点登录?

回答:以微信为例,可以PC端,phone端同时登录,同时收发消息。

需要注意的是,一个端只能登录一个实例,例如同一个QQ号,在pc1上登录,再到pc2上登录,后者会把前者踢出,pc1会收到通知“你已在别处登录xxoo”。

提问:什么是消息漫游?

回答:在任何一个终端的任何一个实例登录qq,都能够拉取到所有历史聊天消息,这个就是消息漫游。

微信目前只支持“多点登录”同时收发在线消息,没有实现“消息漫游”,潜台词是:登出手机微信,登录PC微信,聊天,再登录手机微信,是看不到历史消息的。

【架构回顾】


整个即时通讯架构可以抽象成这么几层:

(1)客户端:例如pc微信,手机qq

(2)服务端:

(2.1)入口层gate集群:能够水平扩展,保持与客户端的连接

(2.2)逻辑层logic、路由层router集群:高可用可扩展,实现业务逻辑,进行消息的路由

(2.3)cache:高可用cache集群,用来存储用户的在线状态,与接入节点(用户具体连接在哪个gate节点)

(2.4)db:固化存储消息,群信息,好友关系链等信息

一个典型的消息投递流程如上图步骤1-5:

(1)用户A登录在gate1上,发出消息

(2)gate1将消息给logic/router

(3)logic/router查询接收方的在线状态(B在线,C不在线)

(4)例如接收方C不在线,存储离线

(4)例如接收方B在线,且登录在gate2上,消息投递给gate2

(5)gate2将消息投递给B

当然,单对单消息有一系列应用层超时、重传、确认、去重的机制,这不是本文的重点,不进行展开,细节详见《微信为啥不丢消息》。

【接收方多点登陆】


接收方多点登录,pc也登录,phone也登录,后一端登录不会将前一端踢出,cache中存储状态与登录点时,不再以user_id为key,改为以user_id+终端类型为key即可。

B:online(状态),gate2(登录点)

改为

B+pc:online(状态),gate2(登录点)

B+phone:online(状态),gate3(登录点)

当用户A给用户B发送消息时,取出所有B的登录点,进行消息群发即可(如上图中步骤4与步骤5)。

【发送方多点登陆】

有朋友可能要问,发送方和多点登录有什么关系?

假设用户A登录了两个点,A1和A2;用户B登录了两个点B1和B2

A(A1发出的)发送消息给B(B1和B2)

B(B1发出的)发送消息给A(A1和A2)

不就可以了么?

其实不然,A(A1发出的)发送消息给B(B1和B2),B(B1发出的)发送消息给A(A1和A2)

A2端虽然收到了所有B回复的消息,但消息其实是在A1端发出的,故A2端只知道聊天消息的一半(所有B的回复),缺失了聊天的上下文(所有A1端的发出)

故,如果发送方也进行了多点登录,发送出去的任何消息,除了要投递给多点登录的接收方,还需要投递给多点登录的发送方。


如上图,发送方A和接收方B都进行了多点登陆,cache中存储的信息为:

A+pc:online(状态),gate0(登录点)

A+phone:online(状态),gate1(登录点)

B+pc:online(状态),gate2(登录点)

B+phone:online(状态),gate3(登录点)

当用户A(phone端)给用户B发送消息时,除了要投递给B的所有多点登录端,还需要投递给A多点登陆的其他端(pc端),如上图中步骤4与步骤5。

只有这样,才能在所有用户的所有端,恢复与还原双方聊天的上下文。

【消息漫游】

如果业务不需要支持“消息漫游”的功能,对于在线消息,如果用户接收到,是不需要存储到数据库的。但如果要支持“换一台机器也能看到历史的聊天消息”,就需要对所有消息进行存储了。


消息投递如上图,用户A发送消息给用户B,虽然B在线,仍然要增加一个步骤2.5,在投递之前进行存储,以备B的其他端登陆时,可以拉取到历史消息。


消息拉取如上图,原本不在线的B(phone端),又重新登录了,ta怎么拉取历史消息?只需要在客户端本地存储一个上一次拉取到的msg_id(time),到服务端重新拉取即可。

这里还有个问题,由于服务端存储所有消息成本是非常高的,所以一般“消息漫游”是有时间(或者消息数)限制,不能拉取所有所有几年前的历史消息,只能拉取3个月内的云端消息。

【总结】

“多点登录”是指多个端同时登录一个帐号,同时收发消息,关键点是:

(1)需要在服务端存储同一个用户多个端的状态与登陆点

(2)发出消息时,要对发送方的多端与接收端的多端,都进行消息投递

“消息漫游”是指一个用户在任何端,都可以拉取到历史消息,关键点是:

(1)所有消息存储在云端

(2)每个端本地存储last_msg_id,在登录时可以到云端同步历史消息

(3)云端存储所有消息成本较高,一般会对历史消息时间(或者条数)进行限制

IM多点登录与消息漫游架构随想相关推荐

  1. 微信多点登录,消息漫游,假如让你来实现?

    有朋友问: 微信如何实现手机端.PC端同时登录,同时收消息? 微信能不能实现,换一个手机,仍能拉取到历史消息? 这是多点登录和消息漫游的问题. 什么是多点登录? 以微信为例,可以PC端,phone端同 ...

  2. 微信多点登录与QQ消息漫游架构随想

    [需求缘起] 之前的一些文章简单介绍了 <"单人消息"><"离线消息"><"群消息"><" ...

  3. 现代IM系统中的消息系统架构 - 架构篇

    前言 IM全称是『Instant Messaging』,中文名是即时通讯.在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉.微信.QQ等以IM为核心功能的产品.当然目 ...

  4. 网易来聊聊子弹短信的消息漫游技术

    "子弹短信"炸翻了创投圈,上线短短7天,掀起IM行业一股巨浪.网易云信作为子弹短信IM以及音视频通话技术提供者,今天来聊聊子弹短信这款即时通讯产品里面一个重要功能-消息漫游. [知 ...

  5. 【2016年第4期】大数据应用系统的消息驱动架构

    贵芳1,李廉1,杨静1,武永卫2 1.合肥工业大学计算机与信息学院,安徽 合肥 230009: 2.清华大学计算机科学与技术系,北京 100084 摘要:基于消息驱动框架的软件开发成为大数据应用系统的 ...

  6. QQ客户端管理聊天记录漫游功能 | 解决经常弹窗消息漫游安全验证,QQ服务独立密码的问题

    QQ客户端管理聊天记录漫游功能 (解决经常弹窗消息漫游安全验证,QQ服务独立密码的问题) 前言 聊天记录漫游功能 情况1:忘记QQ独立服务密码 情况2:设置聊天记录漫游 情况3:更改独立密码验证频率 ...

  7. 直播系统定制开发——海量用户实时消息系统架构演进实践

    1.引言 一套完整的直播系统定制开发核心功能有两个: 1)实时音视频的推拉流: 2)直播间消息流的收发(包括聊天消息.弹幕.指令等). 本文主要分享的是百度直播的消息系统的架构设计实践和演进过程. * ...

  8. 漫游消息服务器出错,消息漫游

    消息漫游 服务设置 默认设置:关闭 是否增值服务:是 功能介绍 同一用户所有已登录设备都可以获取该用户在所有设备上的历史消息: 用户可从服务器获取全部历史消息,也可以根据本地数据库存储的消息有选择的获 ...

  9. 直播系统聊天技术(四):百度直播的海量用户实时消息系统架构演进实践

    本文原题"百度直播消息服务架构实践",由百度APP消息中台团队原创分享于"百度Geek说"公众号,为了让文章内容更通俗易懂,本次已做排版优化和内容重新划分,原文 ...

  10. 百度直播的海量用户实时消息系统架构演进实践

    1.引言 一套完整的直播系统核心功能有两个: 1)实时音视频的推拉流: 2)直播间消息流的收发(包括聊天消息.弹幕.指令等). 本文主要分享的是百度直播的消息系统的架构设计实践和演进过程. 实际上:直 ...

最新文章

  1. fedora如何隐藏顶部状态栏_如何使用PDF Arranger来对PDF文件进行排版和修改
  2. 淘宝内部大量使用的开源系统监控工具
  3. C和指针之函数之求最大公约数
  4. P1463-[POI2002][HAOI2007]反素数【约数,数论】
  5. Spring和JSF集成:导航
  6. spring mvc学习(7):springmvc学习笔记(常用注解)
  7. 使用Canal实现redis和mysql的同步
  8. for 循环 and while 循环(二)
  9. android 移除泛型中元素_Android 代码混淆 混淆方案
  10. 前景检测算法(十四)--SuBSENSE算法
  11. Linux内核hlist数据结构分析
  12. 一种支持多种流媒体协议的播放内核
  13. java安装包_Java6 Update
  14. 常用计算机维修方法有哪些,计算机常见硬件故障的诊断及其处理分析
  15. 计算机网络技术发展四个阶段,计算机网络的发展分哪四个阶段,特点?
  16. flash图片如何镜像翻转_Flash制作跳动的文字镜像效果
  17. matlab2014如何获得hostid,hostid.c/获取主机标识
  18. div左对齐与里面的内容偏左但是距离左边有点儿距离
  19. Linux MMC子系统分析(二)——Host分析
  20. warning:In file included from...

热门文章

  1. GPIO模拟MDC/MDIO协议
  2. 【UEFI实战】HII之uni文件
  3. 如何使用google code
  4. 挠场的科学丨四、穿梭阴阳的挠场——道家风水、八卦、布阵的解密
  5. ensp mstp+vrrp配置实验
  6. 通过APKIDE 反编译文件得到.java文件方法
  7. 国产数据库 OceanBase 二次刷榜 TPC-C,7 亿 tpmC
  8. Java-幸运抽奖系统(综合练习)
  9. 蜂窝网络版苹果iPad mini 6不支持毫米波5G
  10. 苹果 iPhone 13 内置原生壁纸下载