在 IM 系统中,“未读数” 是一个非常核心的概念。
首先,从产品体验上,用户登录之后,往往是由消息 “未读数” 引导用户后续的操作;其次,“未读数” 实现逻辑直接影响了上层业务的核心设计;轻量级的未读数模型,会大大降低服务端负载,提升性能,减少损耗。
IM 的未读数模型包括 “离线存储模型” 和 “在线存储模型”,我们今天结合场景深入分析。
一、离线存储模型
所谓未读数的离线存储模型,是指消息未读数的统计和计算需要借助于离线消息库,见下图场景。
-
当用户 uid=101 发一条消息给离线用户 uid=102 时,处理的逻辑是向 “离线库” 写入一条记录,向 “云消息库” 写入两条记录(在前面的文章 《分层架构 IM 系统之 Das 领域模型设计》 有深入分析);
-
当用户 uid=101 发一条消息给在线用户 uid=102 时,处理的逻辑是只向 “云消息库” 写入两条记录;
-
当用户 uid=102 登录后,会首先从 “离线库” 中拉取所有的离线消息记录到客户端本地,这些离线消息记录的条数是客户端未读数的一部分,还有一部分是已经在客户端本地但未被用户阅读的消息(这是客户端逻辑,不在本文讨论范围)。
可以这样简单来理解未读数的离线存储模型:
-
当用户处于在线状态时,客户端收到消息后,未读数的统计完全由客户端来计算;