默认

实时社群技术专题(二):百万级成员实时社群技术实现(消息系统篇)

查看数: 90640 | 评论数: 4 | 收藏 3
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2023-07-10 00:30

正文摘要:

本文由网易云信资深服务器开发工程师曹佳俊分享,原题“深度剖析“圈组”消息系统设计 | “圈组”技术系列文章”,为了提升内容品质,即时通讯网收录时有修订和删节。 1、引言 鉴于实时社群产品Discord在IM垂直应 ...

评论

JackJiang 发表于 6 个月前
引用:copuzzle 发表于 2025-09-03 09:15
现在是客户端设计是这么样去做的,每个会话会记录最大一条 id, 后面只需要请求差量信息。

但获取有更 ...

正常的逻辑肯定是客户端发出一次请求(这不需要讨论,否则一定是个烂方案),服务端来完成比对,而且服务端借助缓存或数据库工具本身的语法去实现,比客户端要经济多了
copuzzle 发表于 6 个月前
引用:JackJiang 发表于 2025-09-02 18:20
我理解你的意思,基本上im这些相关的业务和需求都没有标准的实现方式,主要是看能适合自已场景的就是最好的 ...

现在是客户端设计是这么样去做的,每个会话会记录最大一条 id, 后面只需要请求差量信息。

但获取有更新的会话列表是个麻烦事,所以现在设计上瓶颈在这里,如果不增加后端的复杂度,那么用户例如有 1000 个会话,就需要向服务端发出至少 1000 次对比请求,这个量还是比较大的。
所以才会提到,服务端提供某种缩小这个数据量的机制。
JackJiang 发表于 6 个月前
我理解你的意思,基本上im这些相关的业务和需求都没有标准的实现方式,主要是看能适合自已场景的就是最好的

微信之所以增量更新做的好,原因是它是扩散写,这也是为什么微信群限制最多500人的一个很重要的原因。

你的同步方案,我的建议就是一定要简单,比如既然是要聚焦客户端的缓存实现,那就把技术思路放在客户端,尽量不要给服务端增加复杂性,这样的话服务端越简单它后绪可优化的操作空间就越大。

建议,可以考虑在客户端给每个会话添加最后一条消息的时间戳记录(甚至不需要单独记录,每个会话的最后一条消息的时间它就是最后一条消息的时间戳),然后用这个时间去跟服务端比对,晚于这个消息的就是需要增量拉取的
copuzzle 发表于 6 个月前
Hi, 我有个场景是用户有好些大群,像 discord 吧,特点是一个群有几十万到百万人,不过在线的人数倒不多,可能几万吧,
基于这种场景,目前服务端使用了读扩散模式,消息存储也是使用的会话群/会话为单位,也就是说获取消息之前都是以会话为单位的。

那么在这种情况下,客户端就会碰到这样的问题,如:一个用户加入了一千个群,他更新了 app 登入手机(或者是杀掉后重新进入应用)
1.客户端需要获取哪些会话有更新,这个列表怎么获取更好
2.客户端需要同步下来那些会话有更新的新消息,每个会话需要请求一次差量消息同步

目前的想到的方案是:
对于会话的消息同步,
1.还是需要以每个会话作为单位去同步消息,不过提供批量接口
2.从服务端获取有消息更新的会话列表(有数量差异更好),在服务端维护 群-最新消息 和 用户-加入群 的表,请求时候的根据用户的全局最大 id , 来 join 计算差异。

我想问的是,有没有更好的协议,或者结构,可以让客户端的这个过程效率更高一些?
因为像微信,它是有一个全局的消息序列,一个同步请示就可以实现会话列表和会话里消息


返回顶部