在 IM 系统中,“用户状态” 通常指用户的离线和在线状态;在一些企业 IM 系统应用中,会对用户的状态进行扩展,比如:“会议中”、“疯狂编码中”、“发热中” 等等;对于前一类用户状态,只需要缓存中记录即可,而对于后一类的用户状态,则需要进行持久化。
在很多的业务场景中,客户端用户特别关注其联系人的在线和离线状态;还记得那些年我们曾每天都会登录的 QQ 吗?通过好友头像的亮度,就知道对方是否在线。
对于客户端用户来说,其好友联系人的在线状态,是怎么同步过来的呢?这一部分内容不是很复杂,我们今天分析一下。
一、IM 部署模型
IM 系统从产生到现在,在这几十年的发展过程中,共有两种部署模型:一种是介绍人模型,一种是代理人模型,见下图。
介绍人模型,也叫直连模型,在服务端的帮助(介绍)下,客户端会直接建立连接进行通讯;这种 IM 模型在 IM 系统最初发展时或在局域网中应该较多,目前在互联网系统中几乎不再应用。
代理人模型,也叫推拉模型,客户端之间的通讯全部由服务端进行代理,因此服务端是一个非常非常关键的角色;目前绝大多数的 IM 系统都采用代理人模型。本 IM 专题所有的文章和实践也全部是基于代理人模型进行讲解的。
二、消息同步模型
在代理人模型中,所有客户端的状态(用户登录之后,即为在线;用户登出或心跳超时,即为离线)都会第一时间同步到服务端,具体来说,在分层架构 IM 系统中,用户状态是同步和保存到路由层的 Router 中。现在问题的关键是,保存在服务端的所有用户的状态数据,如何同步到相关的客户端?
总的来说,有两种实现方式:一种是信箱模型,一种是电话模型;信箱模型在单体架构的消息收发逻辑中分析过(