野火的小伙伴最近在做的一个新功能超级群组即将发布,在这里提前给大家预告一下,也在这里简单讲一下这个功能。
关于IM的群实现有两种方式,这两种方式在网上都有很多介绍,可以很方便地找到,这里简单讲一下:
一种是写扩散,在群里发送一条消息,就会在群内每个用户的时间线上插入一条消息。有种优化的方式是,插入的是消息id,读取消息时先读取到消息id再读取消息。写扩散方式的优点是实现比较简单;缺点是太占用空间,另外写数据库的数量跟群的大小成正比,还有如果有太多消息未同步,没有办法按照会话舍弃旧消息。所以基于写扩散的群都不能太大,一般500人。常见的写扩散的有微信。
另外一种就是读扩散,在群里发送一条消息,在群的时间线上插入一条消息。当用户同步消息时会检查自己的群,按照群的时间线来读取消息。这种方式的优点是写入只有一次,写入比较简单,可以支持超级大群;缺点就是拉取消息比较复杂,每次拉取需要计算哪些群组有消息变更再依次拉取。读扩散的模式可以支持很大的群,电报和QQ都是读扩散实现的。
野火之前的实现方式就是优化的写扩散方式。当遇到超级大群或者非常活跃的群时就有些吃力。我们最近在专业版上研发了读扩散模式,之前的写扩散模式也继续保留。在群的属性中添加了一个superGroup的属性来区分是写扩散还是读扩散。这样一般的群可以继续使用写扩散的方式,公司全员群或者大的客户群可以用读扩散的方式。而且写扩散和读扩散可以自由切换,只需要修改一下群属性就可以了。
由于有了读扩散方式的支持,野火可以像电报一样,支持上万的群成员数,而且没有单点瓶颈,超级大群依赖整个系统的能力,不依赖单个服务的能力。另外针对消息的同步也做了优化,单个会话可以一次同步十万条消息。当然同步的只是消息ID+消息类型+存储属性。这样如果有十万以上的消息也瞬间就同步下来了。当客户端需要显示消息时,如果本地只同步下来消息ID,则会再去服务器同步消息内容。使用野火可以支持无限制群大小和无限制的消息量,可以做到媲美电报的体验。
当然代价也是有的。首先是所有获取消息的接口都要改成异步的,因为有可能是本地数据库的消息,也有可能需要去服务器同步。其次搜索消息是个问题,因为很多消息其实只同步下来一个消息ID,而且本地消息量大会影响本地搜索的耗时,这个问题可以同步开发服务器端搜索来解决。还有不再支持送达报告,只支持阅读报告。因为送达报告其实没有太大用处而且太消耗性能就去掉了。
如果有对超级群组有需求的用户,可以提前联系我们进行试用,如果有特殊需求也可以给我们提。欢迎大家使用!
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。