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