【自问自答】Web IM 消息未读消息这块功能如何实现?

未读消息依赖客户端还是服务端?如何存储?

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。


回答:

如果纯 Web 版本的 IM 消息可以考虑依赖服务端,这样的话实现上简单,比如说 boss 直聘大概率就是这样实现的 getGeekFriendList 拉取会话列表,historyMsg 拉取历史消息。

依赖服务端的话,缺点比如说过期时间(Boss直聘是30天),服务端压力大。

不过 Boss 直聘的架构确实很符合他们的业务场景

  1. 工作量小
  2. 不依赖客户端,所有平台数据共享
  3. 过期时间设置合理(30天大概率工作也找差不多了)
  4. 服务端压力不大(一般来说交流不会太多,也不会太频繁。20条以内)

接下来就是依赖客户端,实现上会比较复杂,我们是分为了两个表会话表和记录表。会话表就只维护 发送方ID接收方ID最后阅读位置(msgId)未读条数(number),当有消息来了就 +1,查看就重置。

当然,这里也会冗余一些消息记录。

这样,客户端渲染时,先拉取本地信息,然后拉取服务端信息(写应用和写本地)。

这样对于服务端的压力会小很多。


纯基于客户端会导致另一个问题,如果有其他平台会导致所有数据丢失

这里我们是让服务端记录了 3d 的数据,可以拉取最近几天的消息。来帮助用户快速适应。

当然, 这里我们其实分为了两个平台(pc 和 m),两个平台的消息是单独拉取的(两个标志位)。

上述问题只是从 pc 换 pc 而发生的。

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

以上是 【自问自答】Web IM 消息未读消息这块功能如何实现? 的全部内容, 来源链接: utcz.com/p/933854.html

回到顶部