IM专题:分层架构IM系统(11)—登录和登出逻辑实现

通过前面 10 篇文章,对 IM 系统的分层架构设计,以及入口层 Entry、路由层 Router、数据访问层 Das 等每一层的核心职责和关键逻辑进行了深度剖析。

今天开始分析 IM 的功能逻辑实现,通过落地系统功能,将前面剖析的每一块内容串联在一起,来体会每一模块在整体架构中的设计和实践。

一、用户登录

首先分析用户登录逻辑,见下图。

图片

以用户 uid=101 为例说明,其登录流程为:

  • 客户端在启动时,会通过 http 方式访问专门用于鉴权的 Passport 服务,获取用于登录的  token,token内嵌uid;
  • 客户端在登录 IM 后端系统时,首先与入口层 Entry 通过三次握手建立 TCP 长连接;
  • 基于该长连接,客户端携带  token,向 Entry 发送登录请求;
  • Entry 不处理业务逻辑,将该登录请求转发给业务逻辑层  Logic;
  • Logic  通过访问 Passport 服务,判断 token 的合法性,若 token 非法,Logic 回复 Entry,Entry 直接关闭与客户端之间的长连接;
  • 若 token 合法,Logic 首先向 Router 中写入登录用户与 Entry 节点之间的映射关系  <uid, 192.168.1.1>;
  • 然后 Logic 将用户登录事件封装成消息,发送到 MQ,MQ 下游的  Extlogic 通过访问数据访问层 Das,将用户登录事件写入到登录库;
  • 最后 Logic 回复 Entry 用户登录成功,Entry 将回复包发送到客户端。

二、重复登录

对于已经成功登录的用户,如果通过其他设备再次登录,此时就会发生 “重复登录”,对于重复登录,我们通常的处理方式是将前一次登录的用户进行 “踢人” 操作,见下图。

图片

用户 uid=101 已经成功登录 IP 是 192.168.1.2 的 Entry 节点,如果该用户此时通过其他移动设备重新发起登录,且连接的是 IP 是 192.168.1.1 的 Entry 节点,那么 Logic  在处理登录请求逻辑时,会通过访问 Router 判断出用户 101 已登录的状态,且连接的是另一个  Entry 节点,此时 Logic 会构造 kickout 包,发送到最初登录连接的 Entry 节点,该 Entry 节点向客户端发送 “踢人” 通知后,关闭与客户端之间的长连接;同时,Logic 会将最新的 <101, 192.168.1.1> 记录写入到  Router 中。

对于两次重复登录连接的是同一个 Entry 节点的情况,处理方式类似。

三、多端登录

如何实现用户的多端登录呢?即同一个用户在不同类型的客户端上同时在线。

实现多端登录的核心设计在于中央存储 Router 登录用户设备类型的支持,见下图。

图片

同一个用户,可以在不同类型的客户端上与 Entry 建立连接,路由层 Router 需要存储 <uid、设备类型、Entry 节点> 这样的三元组记录,uid 可以唯一标识用户,uid + 设备类型 可以唯一标识连接的 Entry  节点。

所以 Router 的数据结构是一个嵌套的 key-value 结构:<uid , <type,entryIp>> , uid 表示用户,type 表示设备类型,entryIp 表示 Entry 节点。

四、用户登出

理解用户登录逻辑之后,用户登出逻辑就非常简单了。

  • 客户端基于与 Entry 之间的长连接,发送登出请求到 Entry;
  • Entry 将登出请求转发给 Logic ;
  • Logic 访问 Router ,清理用户在线的相关数据;
  • Logic 将用户登出事件封装成消息,发送到 MQ,MQ 下游的  Extlogic 通过 Das,将用户登出事件写入到登录库;
  • Logic 回复 Entry 后, Entry 关闭与客户端之间的连接。

五、心跳

客户端成功登录后端 IM 系统后,会周期性发送心跳请求到后端,以保持长连接的活性;同时, Entry 也以客户端心跳为依据判断用户是否已经登出,毕竟在移动时代,很少有用户会有 “登出” 操作了。

  • 客户端发送心跳请求到 Entry,Entry 通过心跳算法处理心跳请求;
  • 同时,Entry 将心跳请求转发给  Logic,Logic 将心跳时间写入到  Router;
  • 当 Entry 发现心跳失活的客户端后,会模拟客户端构造登出请求发给 Logic;
  • Logic 访问 Router ,清理用户在线的相关数据;
  • Logic 将用户登出事件封装成消息,发送到 MQ,MQ 下游的  Extlogic 通过 Das,将用户登出事件写入到登录库;
  • Logic 回复 Entry 后, Entry 关闭与客户端之间的连接。

最后,总结文中关键:

  1. 用户登录时,Logic 完成四件事情:调用 Passport 进行用户合法鉴权、将客户端与 Entry 的映射关系写入到  Router 、将用户登录事件封装成消息发送到MQ、回复 Entry 是否要保留客户端连接;
  2. 判断用户是否重复登录的关键是访问 Router 获取用户登录状态,如果已经登录,通过发送  kickout 包进行踢人处理;
  3. 实现用户多端登录的核心是 Router 支持 三元组存储,即 <uid , <type,entryIp>> ;
  4. 用户登出时,Logic 完成三件事情:清理 Router 中用户在线数据、将用户登出事件封装成消息发送到MQ、回复 Entry;
  5. 当客户端心跳失活时, Entry 模拟客户端构造用户登出请求。

作者:棕生 | 来源:公众号——架构之魂

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论