Qcon 广州主题演讲:融云实时社区的海量消息分发实践

news2024/11/26 11:58:57

移步公众号文章 预约纸质版《作战地图》

5 月 26 日-27 日,QCon 全球软件开发大会落地广州。关注【融云全球互联网通信云】了解更多

融云 IM 服务架构师罗伟受邀分享“实时社区的海量消息分发实践”,从实践中来的前沿技术分享,收获现场开发者的热烈响应和一致好评。

 移步公众号后台回复“QCon”获演讲 PPT~


大火的 Midjourney与高度灵活的实时社区

实时社区的代表性平台 Discord 近期又收获了一波热度,这次是源于谈论 AIGC 无法绕开的“网红”Midjourney。

Midjourney 直接内置集成在 Discord 里,以频道的形式提供服务,上线不到一年已经实现了近 1500 万用户和 1 亿美元营收。

这便是实时社区的神奇之处。它拥有高度灵活性和可扩展性,可以适配多样玩法。无论是虚拟聚会、游戏组队,还是 AIGC 新技术、新应用和新场景,都可以从频道中延展而出,慢慢沉淀。

起初,Discord 被定义为永远在线的聊天室,里面有各种复杂的业务概念,比如子区、公有频道、私有频道。

但从产品形态来说,构建实时社区所使用的融云超级群产品,是完全区别于聊天室和群聊的一种 IM 即时通讯会话类型。(👉点此了解 IM 产品全形态)

或者说,它可以被简单定义为普通群与聊天室的集合

先说成员关系:群组有上限,聊天室没有上限;实时社区像聊天室一样无成员上限,同时又像普通群一样,其成员关系是存储落地的,是永久存在的。

再说消息可靠性:普通群离线再连时,服务端会把离线期间产生的消息都同步到端上;聊天室用户一般只关心实时消息,且海量观众同时发同样的内容(如,赞、666),可以对消息执行一定丢弃策略。而实时社区是既有大量实时消息,但同时又要保证可靠性,每条消息都需要收到。


海量消息高分发场景“避坑实录”

无成员上限且需要保证实时消息可靠性,这就让高并发架构成为实时社区产品设计的关键。

简单来说,高并发架构就是要在正确响应业务请求的情况下,将时长及并发量的拐点后移。这对系统设计、代码都有极高要求,同时也是一个不断迭代、持续优化的过程。

融云高并发架构图,移步公众号后台回复“QCon”看完整 PPT

一个复杂的业务系统,必然需要一个足够复杂的系统来支撑,接入层、服务层、存储层都要分别做最优的考虑和设计。

具体到融云超级群的实践方案上,以下是它的一个简化版本架构图,包括访问接入、内部服务和数据存储及运行维护部分。

简化版融云超级群架构,后台回复“QCon”看完整 PPT

在这里,Group 就是上行的主节点,主要负责信息的校验,比如群成员关系、禁言等,是我们实现高可用的关键。

融云采用弱状态服务实现高弹性伸缩,通过哈希算法,根据落点(如以用户 ID 为落点)将用户固定在一台机器上,让本地内存去缓存一些热点数据、消息。过程中,需要解决以下问题。

1. 实时消息如何解决?

在实时社区中,用户可以同时加入无数个“聊天室”,并且每个聊天室还有频道的概念,面临巨大的消息爆炸挑战。我们通过消息驱动、增量拉取、订阅式会话驱动的组合拳来解决这个问题。

消息驱动就是分发消息的时候写入到内存消息环,而非直接放到缓存中。然后通过内存里去读取,基于时间戳通知、拉取,基于用户落点读扩散,保障实时性。

增量拉取就是为用户建立消息索引,保障单个用户消息时间戳线性增长,保障消息不丢。

订阅式会话驱动,不再基于消息通知,而是把会话的变更同步到客户端。客户端按订阅规则,拉取对应会话消息。服务与客户端之间的网络交互,都被大大降低了,它们的时序也有了相应的保证。

图说实时消息解法,移步公众号后台回复“QCon”看完整 PPT

2. 海量离线消息如何落地?

实时社区中的用户可能加入多个群,每个群又有海量消息。用户离线再上线后,如果所有消息都做同步,会是一个漫长的过程。我们通过几个核心机制来解决这个问题。

会话驱动,用户离线期间产生的消息由服务端计数,包括未读数、未读@数、首条未读、最后一条消息等。再次上线时,通过会话驱动直接一次同步至客户端,而不是一条一条拉取消息,以解决海量离线消息的高并发问题。

消息断档,服务端基于拉取时间戳判断,消息环外的时间戳则标记断档,消息断档前的消息,需要用历史消息补全。这个机制主要解决会话驱动可能会产生的历史消息不全问题。

历史消息补全,不是服务端主动下发,而是由客户端根据最后一条消息,向前补全,或者由客户端根据断档标记自动补全。

图说海量离线消息落地,后台回复“QCon”看完整 PPT


消息分发后的那些“后遗症

假设一个有 80 万成员的实时社区,每秒发布 5 条消息。在 10 台节点支持下,单节点能够处理 10 万用户。

那么,单节点需要每秒处理 40 万分发消息,也就是每秒需要 40 万次的内存计算更新。这将对 CPU 和网络造成巨大压力。

图说实时消息分发压力,移步公众号后台回复“QCon”看完整 PPT

融云在内部实践中把它做成了一个实时会话,引入了读更新和写更新两个机制来完成流量削峰任务。

读更新,也就是说,不在分发的时候计算,而是在拉取的时候由服务端计算。因为在上行的时候已经存储了会话的消息索引,可以按用户所在的群和频道,根据会话的消息索引计算未读数,也可以理解为是一个懒加载的模式。

实际业务中会有一些个人用户相关的特性,需要做到写更新。比如,个人未读数变更时更新(@消息),会话当日首条消息时更新以及会话首次激活时更新。

图说分发压力化解,后台回复“QCon”看完整 PPT

这样,原来分发时需要做的 40 万次内存计算就直接被砍掉了,也就不会再消耗大量的 CPU 了。

与之对应的,用户上线时同步会话,主节点会在上行时保存一条占用存储非常小的消息索引。

最终,就可以做到把高峰流量计算和 CPU 占用转化为在用户拉取时才占用内存和网络,实现了削峰的目的。


作为国内第一款超级群 PaaS 产品和原生技术架构,融云超级群是专为打造类 Discord 实时社区而创建的全新会话类型。

这款产品目前已经支持某大型游戏用户社区、某出海元宇宙社区、某会展元宇宙平台等多类业务上线并持续运营,在帮助应用提升用户粘性和拓展社交属性方面释放出了巨大能量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nautilus Chain上首个DEX PoseiSwap即将开启IDO,潜力几何?

据悉,Nautilus Chain 上的首个 DEX PoseiSwap 即将开启 IDO ,根据官方的最新公告显示,PoseiSwap 即将于 6 月 13 日至 6 月 14 日期间,在 Bounce 平台开启其治理通证 $POSE 的 IDO(Initial DEX Offering)&a…

openEuler Linux 部署 FineReport

openEuler Linux 部署 FineReport 部署环境 环境版本openEuler Linux22.03MySQL8.0.33FineReport11.0 环境准备 升级系统内核和软件 yum -y updatereboot安装常用工具软件 yum -y install vim tar net-tools 安装MySQL8 将 MySQL Yum 存储库添加到系统的存储库列表中 s…

【JavaEE】表白墙再升级(MySQL实现持久化)

表白墙再升级(MySQL实现持久化) 文章目录 【JavaEE】表白墙再升级(MySQL实现持久化)1. 后端引入JDBC的依赖2. 建库建表3. 编写数据库代码(JDBC)3.1 doGet方法改写3.1.1 构建本地数据源3.1.2 用本地数据源构…

移动端的轮播图

效果 技术选取 前端框架用的是vue3,使用的组件库为element-plus以及vant4 引入element-plus和vant4 安装element-plus cnpm install element-plus --save 安装按需导入 cnpm install -D unplugin-vue-components unplugin-auto-import 安装Vant cnpm i vant 按…

Fiddler抓包工具之fiddler的composer可以简单发送http协议的请求

一,composer的详解 右侧Composer区域,是测试接口的界面: 相关说明: 1.请求方式:点开可以勾选请求协议是get、post等 2.url地址栏:输入请求的url地址 3.请求头:第三块区域可以输入请求头信息…

图的简单理解

文章目录 1、图的基本概念2、图的存储结构2.1 邻接矩阵2.2 邻接表 3、图的遍历3.1 广度优先遍历3.2 深度优先遍历 4、最小生成树4.1 Kruskal算法4.2 Prim算法 5、最短路径5.1 单源最短路径–Dijkstra算法5.2 单源最短路径–Bellman-Ford算法5.3 多源最短路径 1、图的基本概念 …

路径规划算法:基于差分进化优化的路径规划算法- 附代码

路径规划算法:基于差分进化优化的路径规划算法- 附代码 文章目录 路径规划算法:基于差分进化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

nginx的rewrite功能

常用的Nginx 正则表达式 ^匹配输入字符串的起始位置$匹配输入字符串的结束位置*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”,但不能匹配“o”?匹配前面的字符零次或一次…

【动态规划专栏】--简单-- 动态规划经典题型

目录 动态规划 动态规划思维(基础) 状态表示(最重要) 状态转移方程(最难) 初始化(细节) 填表顺序(细节) 返回值(结果) 解码方…

【Python FTP/SFTP】零基础也能轻松掌握的学习路线与参考资料

一、Python FTP/SFTP的学习路线 Python FTP/SFTP是Python语言的两种常用的文件传输协议。在学习Python网络编程过程中,学习FTP/SFTP是非常重要的一步。下面给出Python FTP/SFTP的学习路线: 了解FTP/SFTP协议 在开始学习Python FTP/SFTP之前&#xff0…

LSB信息隐藏——Python实现(完整解析版)

系列文章目录 仿射密码实验-Python实现 仿射密码实验——Python实现(完整解析版) DES密码实验-C语言实现 MD5密码实验——Python实现(完整解析版) 文章目录 系列文章目录前言实验方法实验环境实验内容实验步骤1.LSB原理2.确定设计模块Lsb——embdedLsb——extract 实验结果实验…

performance_schema 初相识 配置详解 应用

千金良方:MySQL性能优化金字塔法则 第4章 performance_schema初相识 第5章 performance_schema配置详解 第6章 performance_schema应用示例荟萃 简介 1、实时监控Server性能监控和诊断的工具 2、它提供了丰富的性能指标和事件,可以帮助你深入了解 MyS…

2023年6月PMP®项目管理认证招生简章

PMP认证是Project Management Institute在全球范围内推出的针对评价个人项目管理知识能力的资格认证体系。国内众多企业已把PMP认证定为项目经理人必须取得的重要资质。 【PMP认证收益】 1、能力的提升(领导力,执行力,创新能力&#xff0c…

python 编译安装指定版本 for linux

python环境是linux中必备的,部分发行版会自带python,有时候需要安装手动安装 注意:如果需要多个版本并存,建议使用conda环境,如果自己配置多版本,需要用多个软链接 conda环境,可以参考&#x…

【CSS Zoro 01】说在前面 CSS概念 CSS语法 CSS选择器 元素 id 类 组合 通用 分组 属性 后代 子元素 相邻兄弟

CSS 说在前面概念语法 syntaxCSS选择器 说在前面 最近挺喜欢看One Piece的,并且发现前端三剑客如果对应上Sanji,Zoro和Luffy的话会很有趣,所以说非常想在博客里面对应上小彩蛋,即使会损失一些SEO,但是这样做对我来说很…

算法修炼之筑基篇——筑基一层(解决01背包问题)

✨博主:命运之光 ✨专栏:算法修炼之练气篇​​​​​ ✨博主的其他文章:点击进入博主的主页 前言:学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了,下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期…

raise AssertionError(“Torch not compiled with CUDA enabled“)

1、运行代码可知,当前cuda不可用。 import torch print(torch.cuda.is_available()) # False 2、打开power shell or cmd,输入nvidia-smi命令,检查当前英伟达显卡信息。 可知当前驱动版本512.78,支持的cuda最高版本为11.6&…

时间序列教程 六、深度学习与时间序列分析结合

一、深度学习方法 与传统的时间序列预测模型相比,神经网络有以下几个好处: 1、自动学习如何将趋势、季节性和自相关等系列特征纳入预测。 2、能够捕捉非常复杂的模式。 3、可以同时建模许多相关的系列,而不是单独处理每个系列。 但是神经网络有一些劣势: 1、模型的构建可能…

PyCharm开发工具的安装与使用

PyCharm集成开发工具(IDE),是当下全球python开发者,使用最频繁的工具软件。绝大多数的python程序,都是在PyCharm工具内完成的开发。 1.先进行下载并安装它 下载官网地址:https://www.jetbrains.com/pycharm/download/#sectionwindows 宝子…

SpringBoot自定义拦截器实现权限过滤功能(基于责任链模式)

前段时间写过一篇关于自定义拦截器实现权限过滤的文章,当时是用了自定义mybatis拦截器实现的:SpringBoot自定义Mybatis拦截器实现扩展功能(比如数据权限控制)。最近学习设计模式发现可以用责任链模式实现权限过滤,因此本篇采用责任链模式设计…