【自问自答】Web IM 消息未读消息这块功能如何实现?
未读消息依赖客户端还是服务端?如何存储?
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
回答:
如果纯 Web 版本的 IM 消息可以考虑依赖服务端,这样的话实现上简单,比如说 boss 直聘大概率就是这样实现的 getGeekFriendList
拉取会话列表,historyMsg
拉取历史消息。
依赖服务端的话,缺点比如说过期时间(Boss直聘是30天),服务端压力大。
不过 Boss 直聘的架构确实很符合他们的业务场景
- 工作量小
- 不依赖客户端,所有平台数据共享
- 过期时间设置合理(30天大概率工作也找差不多了)
- 服务端压力不大(一般来说交流不会太多,也不会太频繁。20条以内)
接下来就是依赖客户端,实现上会比较复杂,我们是分为了两个表会话表和记录表。会话表就只维护 发送方ID
、接收方ID
、最后阅读位置(msgId)
、未读条数(number)
,当有消息来了就 +1
,查看就重置。
当然,这里也会冗余一些消息记录。
这样,客户端渲染时,先拉取本地信息,然后拉取服务端信息(写应用和写本地)。
这样对于服务端的压力会小很多。
纯基于客户端会导致另一个问题,如果有其他平台会导致所有数据丢失
这里我们是让服务端记录了 3d 的数据,可以拉取最近几天的消息。来帮助用户快速适应。
当然, 这里我们其实分为了两个平台(pc 和 m),两个平台的消息是单独拉取的(两个标志位)。
上述问题只是从 pc 换 pc 而发生的。
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
以上是 【自问自答】Web IM 消息未读消息这块功能如何实现? 的全部内容, 来源链接: utcz.com/p/933854.html