IM多点登录与消息漫游架构随想
来源:互联网 发布:未来国际局势知乎 编辑:程序博客网 时间:2024/06/11 06:12
提问:什么是多点登录?
回答:以微信为例,可以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多点登录与消息漫游架构随想
- 微信多点登录与QQ消息漫游架构随想
- IM服务器架构随想
- 架构随想
- IM 架构
- QQ漫游消息使用
- Android 容联云IM集成:初始化与登录中的坑
- 《大数据日知录:架构与算法》试读 随想
- 单点登录与消息队列
- 我与即时通讯- 企业即时通讯(IM)服务架构
- IM 去中心化概念模型与架构设计
- IM 去中心化概念模型与架构设计
- IM消息透传
- IM收发消息问题
- 多点登录限制,禁止单用户多点在线
- 现代IM系统中消息推送和存储架构的实现
- 现代IM系统中消息推送和存储架构的实现
- 现代IM系统中消息推送和存储架构的实现
- 贝叶斯网的推理模式
- STL工具库使用解析系列之一 STL::map
- Codeforces Round #448 (Div. 2): C. Square Subsets(线性基)
- 图像处理入门必看
- tinymce编辑器的高度随内容自动变化
- IM多点登录与消息漫游架构随想
- 计算机组成与设计(一)——计算机概要与技术
- 内核模块已打开,但开机未加载
- Android Scrollview上滑停靠—悬浮框停靠在标题栏下方(防微博详情页)
- React中的props和state
- 前序——中序建树
- jQuery 显示和隐藏-冒泡传播点击
- 私有云落地解决方案之openstack高可用(pike版本)-keystone
- EasyDSS流媒体解决方案之多方式虚拟直播