有朋友问:

  • 微信如何实现手机端、PC端同时登录,同时收消息?

  • 微信能不能实现,换一个手机,仍能拉取到历史消息?

这是多点登录消息漫游的问题。

什么是多点登录?

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

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

什么是消息漫游?

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

画外音:微信目前只支持“多点登录”同时收发在线消息,以及最近几条消息的“消息漫游”,没有实现全部消息的“漫游”。

典型即时通讯架构如何?

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

  • 客户端:例如pc微信,手机qq

  • 服务端:

入口层gate:保持与客户端的连接;

逻辑层logic、路由层router:实现业务逻辑,进行消息的路由;

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

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

画外音:都需要考虑高可用,扩展性。

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

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

(2) gate1将消息给logic/router;

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

(4.1) 假设接收方C不在线,存储离线;

(4.2) 假设接收方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端)重新登录了,怎么拉取历史消息呢?

只需要在客户端本地存储一个上一次拉取到的msg_id(time),到服务端重新拉取即可。

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

画外音:

你猜,微信有没有存储,几年前的消息呢?

你猜,交一个超级会员费,是不是可以查询呢?

总结

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

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

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

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

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

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

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

微信多点登录,消息漫游,假如让你来实现?相关推荐

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

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

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

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

  3. python 发微信 自动登录_用python自动给微信好友发消息

    由于itchat运行时,老是报KeyError: 'pass_ticket',故itchat暂不能使用.而wxpy在使用时需要登录网页版微信,且动不动报KeyError: 'pass_ticket,所 ...

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

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

  5. 企业微信推送消息延迟_iPhone手机微信推送消息总是延迟怎么办?

    在有些时候我们的苹果手机屏幕页面总是有微信消失提示,但是我们打开微信页面刷新很久也看不到相应的消息记录,让我们总是没有办法及时回复一些好友消息.如果是一些工作上的关键信息就很麻烦了,毕竟现在微信已经深 ...

  6. 产品生涯你无法躲开的设计:微信授权登录

    作者简介:曾负责某一线电商亿级用户的Passport产品工作,任职期间也进行了账户体系的相关改造设计. 越来越多用户倾向于选择微信作为全网登录账号,因此微信联合登录被许多APP产品作为第三方联合登录的 ...

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

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

  8. 微信公众平台消息接口开发(34)微信墙之表白墙/婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙...

    微信公众平台开发模式 微信 公众平台 消息接口 开发模式 企业微信公众平台 微信墙 婚礼墙/晚会墙/会议墙/晒单墙/照片墙/历史墙 历史上的今天 作者:方倍工作室   原文: http://www.c ...

  9. python 微信聊天机器人_python操作微信自动发消息的实现(微信聊天机器人)

    前言 最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微信,而这个库是通过微信网页版来操作微信的,现在微信网页版已 ...

最新文章

  1. 你是否真的了解全局解析锁(GIL)
  2. 在pycharm中通过VCS快速提交代码
  3. led灯串怎么摆造型_一元包邮的家用LED日光灯泡,究竟是怎么做到的?
  4. Redis中的发布与订阅的概念与以命令行的方式实现发布订阅举例
  5. 分享内容apd android,Appium - DesiredCapabilities对象的参数配置及含义
  6. ASP.NET Core 双因素验证2FA 实战经验分享
  7. jsp 页面中文乱码解决(笔记)
  8. Spring中PropertyPlaceholderConfigurer的使用
  9. 无需安装配置,多操作系统支持数据库及性能测试
  10. java遍历d盘所有文件夹_java遍历指定盘符的所有文件和文件夹
  11. taskctl跨调度服务依赖实现
  12. 网络计算机和弱电,弱电工程师和网络工程师的区别,你知道吗?
  13. Oracle 索引详解(index)
  14. Scratch二次开发6:如何保存作品到自己的服务器
  15. 【drawio笔记】新增字体
  16. 二、网络编程之协议及协议格式详解
  17. python判断字符串是否包含英文字母
  18. 普通路由器改4g路由器_4G工业路由器物联卡批发价格是多少?良心厂家推荐
  19. vin接口车架号vin查询车型
  20. 微信小程序笔记、小程序打印

热门文章

  1. android扁平风格png图标,8000个已分类好的扁平化图标(PNG/SVG/WEBFONT)
  2. 突然!微软宣布永久关闭全球实体店
  3. CPU governor (by quqi99)
  4. 三星VR新专利曝光,支持悬空手势识别
  5. 学习AP历史有哪些建议?
  6. 关于Keil5 jlink 与DFP包安装及排错经验笔记
  7. 【Minecraft】【ModPC】【我的世界】 我的世界电脑版如何进入网络游戏?
  8. 吐槽memoQ | 实时预览能不能更强大?
  9. C语言中 定义数组大小时 不能使用变量,编程达人 C语言中数组长度不能用变量定义吗...
  10. 中国智能家居设备行业竞争策略展望分析及投资战略规划研究报告2022-2028年