以钉钉为例,钉钉产品的定位是商业和办公,钉钉是实现了已读功能的,微信是生活方面的产品,所以并没有实现已读功能
已读功能在读扩散和写扩散实现的方式是不同的
写扩散情况下实现已读功能
我们数据库中存在很多消息的索引数据,我们可以给每条索引数据加上一个已读字段,当我们进入到聊天界面的时候,我们可以将已读的messagekey上报给服务端,服务端根据messagekey修改对应消息的已读状态
读扩散的情况下实现已读功能
1. 我们用一个值来记录群成员读到了哪条信息,比如说群中聊天记录最后一个的seq是100,我们群成员进入到群中的时候就将最后一条信息的seq记录下来,这个用户读到了100这个消息,100以前的消息都算已读,
2. 将seq跟我们的会话绑定,会话就标识聊天框,不同聊天框有不同的会话,不同的会话的seq也不相同,当我们已读消息的seq我们就修改会话的seq值,这样虽然没有写扩散精准但是也满足了大部分需求‘
已读功能怎么实现的?
我们的系统定位如果是社交娱乐,我们使用的是一张会话表,我们用这个表来记录用户与用户之间已读的消息偏序,对于在线的用户我们可以把消息投递给对方,告诉对方我已经已读了,如果是不在线的用户,下一次上线的时候,也可以根据这张表的数据拉取到是不是已读,已读到哪一条消息
但如果是特殊情况,比如是钉钉,钉钉这种办公和商务的需求我们可以使用写扩散,记录每一个用户对应消息的已读状态,我们想要拉取某一条消息的已读详情时,根据消息id+群id就可以获取到