未读消息设计
当用户在线时
本地记录会话未读消息数,当消息发送后使其+1,当用户点开会话之后,向服务端发送更新请求,用客户端的最后一条消息更新lastRead。客户端本地计数清零。
当用户上线时
服务端先不直接查询所有消息记录,大部分时间用户不会查看一些无用群聊消息,所以服务端只查询count seq < lastRead的数量,以及最后一条消息内容,用于展示在会话列表上,本地记录这个数量作为未读消息数。当用户点开会话之后,再去拉取seq < lastRead的消息内容。并更新lastRead。
整体的模型
对于离线消息采用扩散写,一种极端的做法是,服务端保存会话的lastRead和isNotice状态,当用户离线之后,如果有消息发送,记录这个这个会话有离线消息也就是通知,用户上线根据所有会话的isNotice去判断是否需要拉取离线消息。