【需求缘起】

之前的一些文章简单介绍了

《“单人消息”》《“离线消息”》《“群消息”》《“用户状态”》的一些相关技术(点击上面的link直接阅读),今天来聊一聊“多点登陆”与“消息漫游”。

提问:什么是多点登录?

回答:以微信为例,可以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)云端存储所有消息成本较高,一般会对历史消息时间(或者条数)进行限制

==【完】【帮忙转发】==

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

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

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

  2. 微信客服之qq消息提醒

    当用户有消息进入微信公众平台,让接口自动回复消息到客服QQ上,达到及时回复的目的 <?php/******************************************* 发送QQ信息 ...

  3. 基于python,控制微信自动登录并发送消息给指定联系人

    给出微信联系人.微信启动路径.消息内容,实现自动登录并并发送消息,如果需要定时发送可以开一个线程或者用while True实现.上代码,报错的话可能是缺少对应的库,自行百度安装即可. 下面代码 复制后 ...

  4. 为什么把devc++上的程序发到qq_微信上能登陆QQ了!腾讯QQ小程序使用体验

    虽然都是腾讯出品的聊天工具,但一直以来,「微信」和「QQ」都是比较独立的存在.QQ 功能丰富而微信追求减法,两者各有优缺点但并无优劣之分.不过自从微信出了「小程序」后,可扩展性就非常强了.比如你有想过 ...

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

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

  6. 微信发红包、QQ登录、搜索框、水杯、聊天窗口、两台电梯、微信/淘宝支付、笔、 抖音发布短视频等功能测试用例

    文章目录 一.微信发红包测试用例 三.搜索框测试用例 四.水杯测试用例 五.聊天窗口测试用例 六.两台电梯测试用例 七.(微信/淘宝)支付功能的测试用例 八.笔测试用例 九.抖音发布短视频功能测试用例 ...

  7. uniapp实现微信登录或者QQ登录

    uniapp实现微信登录或者QQ登录 无论是哪种登录, 都要用到uni.login 一. 获取服务供应商 在实现登录前,先查看一下可以使用哪种方式登录. 在APP平台, 可用的服务商, 是打包环境中配 ...

  8. 硅谷课堂 12_公众号消息和微信授权登录

    硅谷课堂第十二天-公众号消息和微信授权登录 文章目录 硅谷课堂第十二天-公众号消息和微信授权登录 一.公众号普通消息 1.实现目标 2.消息接入 2.1.公众号服务器配置 2.2.验证来自微信服务器消 ...

  9. 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇

    第三方登录平台接入 (QQ\微信登录) QQ登录接入 第一步成为QQ应用开发者,审核期限七天 一.所需材料 1.公司注册相关信息 2.营业执照扫描件 微信登录接入 第一步成为微信开发平台开发者,认证费 ...

最新文章

  1. 最短路径 - dijkstra
  2. Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用...
  3. VTK:Rendering之Cone4
  4. oracle无法修改字段类型,Oracle如何修改字段类型呢? 爱问知识人
  5. linux内核参数的程序,技巧-Linux内核参数调整办法
  6. VC++用异或(XOR)方式实现拖放画动态直线
  7. 微信支付国庆消费数据出炉:门票交易增幅超8成 酒店行业交易增幅超7成
  8. Windows Server 2012 存储 (三)SMB 的高可用性
  9. linux 串口中断_1600字干货 | 大佬讲Linux启动流程(内含福利)
  10. 面向服务的架构SOA
  11. Android 如何通过Retrofit提交Json格式数据
  12. jQuery实现表格冻结行和列
  13. Java读中文乱码解决方案
  14. 某摄像头的游戏的总结
  15. SSD: Single Shot MultiBox Detector 模型fine-tune和网络架构
  16. 【C++】Clang-Format:代码自动格式化(看这一篇就够了)
  17. Linux_常用命令符每天积累
  18. 百度SDK移动开发平台学习 - 人体分析
  19. 本地项目连接虚拟机的数据库oracle
  20. linux 下shell中if的“-e,-d,-f”是什么意思

热门文章

  1. 树莓派bond问题排查与分析
  2. 下次再也不用清理注册表工具了
  3. 逻辑延时环节(DLD)
  4. HP-UX /usr/lib/dld.sl: Can't open shared library:解决办法
  5. 解决win7 USB键盘鼠标未识别
  6. Mendix中OQL
  7. 网站服务器变了还需重新做icp备案,已备案成功的域名更换服务器,还需要重新备案吗?...
  8. 科研、论文写作及修改
  9. CTF 【每日一题 20160707】凯撒加密
  10. 第一次写博客+学习学习markdown