我与梅西粉丝们的世界杯观球日常

news2024/11/23 21:50:39

世界杯 ⚽️ 期间,我与其他的梅西粉丝在某 APP 里建了个梅粉聊天群,群内人数上万人,大家一起讨论赛事热点,可谓热火朝天,此起彼伏,这是四年一度的狂欢,虽值冬季,但热情不减。

“阿根廷 1 比 2 遭沙特逆转!!!!”

“支持阿根廷队!!!!”

“球王梅西加油啊”

“想梅西有一个好的落幕”

......

梅西进球的一刻,激动的心颤抖的手,瞬间直达快乐巅峰,万人齐呼梅西威武;遭沙特逆转之时,心情失落无以言表,群内刷满了对梅西带领下的阿根廷队惜败沙特的震惊、恍惚、悲痛、惋惜。

是的,我被梅粉群的万条消息刷屏了。

大型群聊聚集了同一项目爱好者,将单纯的群聊功能转变为线上俱乐部性质的大型发烧友群聊,上述场景中大规模球迷们的即时消息推送,是区别于普通 IM 房间的,类似这种超大规模 IM 通讯场景,如万人观看直播并进行互动评论万人搭建兴趣群聊等都会面临人数无上限、消息高并发的情况,所以设计一套稳定可靠的架构来保障用户通信的稳定性与可靠性就十分必要。 

百万人超大房间即时通讯面临的问题

所谓百万人超大房间即时通讯,就是指支持百万人同时在房间中发送即时消息,进行线上互动。越是这种大规模即时通讯的背后,越是需要进行精心的架构设计,接下来我们以一个百万人超大房间为例,来看看针对这种大规模互动的 IM 通信场景,究竟要在架构设计环节中考虑到哪些问题才能更好的保障用户通信的高质量。

  • 高并发进出房间:比如定期做活动时,面对房间内瞬间涌入的大量用户,就需要处理高并发房间的进出,以及推送房间进出变更通知;

  • 消息推送:每发送一条消息,都要推送给近一百万人,推送压力极大;

  • 客户端性能:同一时段往房间内发送大量消息,如果将所有消息都推送给客户端,很可能导致客户端出现卡顿、消息延迟等问题,进而严重影响用户体验;

  • 对外感知:百万级超大房间与普通房间支持功能是否有差别,对外感知是否一样,客户是否有额外的接入成本;

  • 消息存储:海量消息的情况下,如果每条消息都长期存储,将导致服务缓存使用量激增,使得内存、存储成为性能瓶颈。

上述列出的这些问题,是我们在设计百万人超大房间架构时需要考虑到的。ZEGO 即构科技在之前推出的 ZIM(ZEGO Instant Messaging) 中,针对大规模百万人房间即时通讯做了特殊的架构设计,以实现安全可靠、有序稳定的线上互动!

房间功能特性对比


首先,我们来对比下普通房间与 ZIM 中超大房间在功能特性上的差异,主要体现在以下两点:

  • 对超大规模房间的人数不做限制;

  • 收发消息,设置房间 kv 属性等功能要保证可靠性。

下图列出了 ZIM 中超大房间与普通房间的功能特性对比:

从上图中我们可以清晰的看到普通房间与超大房间的差异,接下来我们一起看下即构 ZIM 在超大房间架构模型设计上的思考与实践。

ZIM 超大房间架构模型

ZEGO 实现超大房间的服务架构如下图所示,其中主要的设计理念是:将超大房间拆分成多个子房间,分布到不同的 worker 节点来处理,以解决单点问题。

作为 to B 公司,子房间的概念只在我们的 SDK 与后台服务之间交互时使用,可以平滑的从普通房间切换到超大房间,对客户是完全无感知的,不需要为此增加接入成本。

超大房间架构图

关于上图中的各服务,我们来详细的介绍下各模块的具体功能:

  • 接入服务:负责客户端的接入;

  • room-router:路由服务(简称 router),来自客户端的请求会随机选择一台 router 节点,然后 router 根据特定规则路由到 room-worker 节点;

  • room-worker:工作进程(简称 worker),负责具体的业务处理,比如进入房间、退出房间、发送房间消息等;

  • 推送服务:负责各种信令与消息的推送,比如进出房间通知,消息推送等。推送服务与工作进程之间通过消息队列解耦;

  • 缓存数据库:存储房间各种信息,包括房间用户列表、房间 kv 属性、消息列表等。

技术实现的关键逻辑

为实现超大房间,我们对许多逻辑功能做了针对性的优化,主要体现在以下几点:

1 房间扩展 

  

概念上,我们称最初建立的房间为“主房间”,如果主房间人数满了(比如 500 人),则为其分配“子房间”。当有新用户进入房间时,如果主房间或者子房间还有空位,则进入相应房间;如果人数都满了,则会继续分配新的子房间。

为了合理选择房间(包括主房间与子房间)进入,需要维护每个房间的人数信息,做好房间人数信息同步,以及合理设计房间选择策略。

1.1 房间人数信息同步

对于高并发的进房间请求,每次进房间处理是需要时间的,等进房间成功了再更新房间人数,很可能导致大量请求涌入到同一个房间。

为了解决高并发进房间的问题,即构提出“预分配人数”概念,即分配给某个房间一个新的用户,就将预分配人数加一,预分配人数满了,则不再进入新的用户。

1.2 房间选择策略

router 根据缓存的房间人数信息,选择没有满员的房间进入。如果所有房间都满了,随机选择一个,由 worker 做下一步处理。

由于 router 节点有多台,且缓存的房间人数信息有可能滞后,worker 节点处理进房间请求时,该房间可能已经满了,如果出现这种情况则执行“重定向逻辑”,重新选择或新建一个子房间。

重定向逻辑主要有:

  • 选择没有满员的房间进行重定向;

  • 如果所有房间都满了,则新建一个子房间;

  • 为了防止进入房间时,出现连续多次重定向,对于已经是重定向的请求,可以超出房间人数上限,保证进入房间成功。

2 房间合并 

  

随着房间用户的进出,如果出现多个子房间人数较少的情况,则主动合并子房间,减少服务端性能消耗。合并中的房间不允许新的用户进入,房间合并后,客户端与新的子房间进行交互。

3 房间消息的发送与拉取 

  

用户发送房间消息时,由该用户所在子房间进行处理,以避免单点问题。子房间同时会将消息扩散给其它子房间,拉取消息时只需要从子房间进行拉取。消息的发送与拉取过程如下:

房间消息发送与拉取过程图

这其中包含的主要步骤如下:

发送房间消息:由子房间处理,并扩散给其他子房间节点。

消息扩散:子房间所在节点会在服务缓存内维护一份消息列表,一个节点只需要保存一份,如果一个节点包含多个子房间,则共享这份信息。

消息存储:将全量消息保存在缓存数据库,worker 节点重启或者消息不连续时,可以从缓存数据库中恢复。

消息拉取:消息拉取同样会分散到各 worker 服务,避免单点问题。

房间 kv 属性的修改与房间消息的实现类似,此处不再单独进行介绍。

4 消息推送 

  

消息推送最大的难点就是推送的扩散,在超大房间场景中,房间成员变更、房间属性变更,聊天消息都会扩散给房间内所有用户,对于百万人数级别的房间,这个扩散量是非常大的,对服务器性能与带宽都是很大的考验。

4.1 推送扩散问题解决

为解决扩散问题,在接入层直接保存房间的用户列表信息,推送消息时,内部服务只需要推送一个包到接入服务,然后由接入服务进行扩散,可以大幅降低推送扩散程度。

我们以发送房间消息为例,看下推送过程:

消息推送过程图

4.2 进一步优化推送包数量

推送到客户端的消息包量过多时,对服务端与客户端都有很大的压力,我们通过合并推送进一步降低推送包的数量。

将多条消息合并后一起推送给客户端,意味着有些消息会产生推送延迟。为了兼容推送速度与推送性能,即构使用分阶梯推送策略:消息量比较小时,不做合并,逐条即时推送;消息量比较大时,再逐步提升合并条数。

总结

在已有实例参考的一起看球、一起看电影的场景中,从数十人的小型同好会变成超大型的线上俱乐部、论坛等,ZEGO 即构科技在 ZIM 中的大规模房间架构设计让更多人实时在线互动成为可能,也让众多不可线下观球的梅粉们远距离嗨翻屋顶、百万人同频交流!

ZEGO 即构科技 ZIM 大规模房间架构设计——

可支持房间人数无上限,超大房间与普通房间之间平滑切换;

可在接入层保存房间信息,提升推送性能,并且大幅度降低带宽消耗;

有灵活的推送策略,兼顾低频时的推送速度,以及高频时的推送性能;

收发消息与设置属性都保证可靠!

最后,让我们祝福梅西 ⚽️ ,捧得大力神杯🏆!

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

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

相关文章

配置设备远程管理—eNSP

案例:给路由器配置远程管理,使一台路由器远程管理另一台。 所需设备:两台路由器,一根网线 图示 一、给两台设备配置IP地址 AR1(以下命令) a. sy b. int g0/0/0 c. ip add 1.1.1.1 24AR2 a. sy b. int g0/0…

十分钟学完简单工厂,普通工厂,抽象工厂

快速学习简单工厂,普通工厂,抽象工厂前言:产品等级和产品族工厂模式作用简单工厂模式uml代码优缺点普通工厂模式uml代码优缺点抽象工厂模式uml代码优缺点前言:产品等级和产品族 在学习工厂模式之前,先得了解一下产品等…

Redis实践

一、持久化 Redis 的数据 全部存储 在 内存 中,如果 突然宕机,数据就会全部丢失,因此必须有一套机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的 持久化机制,它会将内存中的数据库状态 保存到磁盘 …

Spring——AOP原理及流程详解

AOP原理及流程详解一、AOP结构介绍Pointcut通知原理连接点拦截器二、Bean介入点EnableAspectJAutoProxyAspectJAutoProxyRegistrarAnnotationAwareAspectJAutoProxyCreatorAbstractAutoProxyCreator实例前执行初始化后执行循环依赖会调用总结三、处理切面获取所有切面其下通知方…

国内饮料行业数据浅析

大家好,这里是小安说网控。 饮料一直深得年轻人的宠爱,主要消费品类为饮用水、碳酸饮料、奶制品、气泡水等。刚刚过去的十月份,我国饮料产量当期值1199.6万吨,同比下降6.1%;今年1-10月份,饮料产量累计值157…

这几个点让我买了Watch Ultra

01.凑够Apple 全家桶 MacBook ProiPhoneAirPodsiPad 02.可以解锁iPhone手机,MacBook,iPad 03.当iPhone 来电话,不方便接听,可以使用Watch接听(虽然这种情况挺少) 04.可以连接AirPods 听音乐 05.花10元钱开卡,iPhone和Watch 可以…

前端ES6-ES11新特性

ES6新特性 变量声明 let a; let b,c,d; let e 100; let f 521, g iloveyou, h [];块级作用域 {let girl 周扬青; }console.log(girl); //这里会报错,变量不在作用域内,用var声明就可以常量声明 const NAME tom; //必须赋予初始值,变量名大写&am…

3-7数据链路层-设备

文章目录一.网桥1.基本原理2.透明网桥(1)工作原理(2)自学习算法3.源路由网桥二.局域网交换机1.局域网交换机2.原理3.特点4.两种交换模式5.交换机的自学习算法一.网桥 网桥根据MAC帧的目的地址对帧进行转发和过滤。当网桥收到一个…

Java中数组、集合初始化及遍历方式

一、数组 1. 一维数组 一维数组两种初始化方式 静态初始化 int[] array {1,2,3};int[] array new int[]{1,2,3};动态初始化 int[] array new int[3]; array[0]1; array[1]2; array[2]3;一维数组两种遍历方式 普通for循环for (int i 0; i < array.length; i) {System.ou…

全家桶Spring、HikariCP、Mybatis和Oracle配置,你想要的都在这里

目录1、HikariCP配置说明2、spring配置文件里&#xff0c;配置HikariCP数据库连接池3、注意连接池大小设置&#xff0c;重点推荐官方说明文档4、HikariCP配置5、数据库配置文件1、HikariCP配置说明 HikariCP: https://github.com/brettwooldridge/HikariCP 2、spring配置文件…

毕业设计-机器学习人眼检测活体检测-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

视效剧情口碑双爆棚!Netflix 现象级剧集《怪奇物语》第四季神级视效专访大揭秘!

刷新 Netflix 收视记录的超火剧集《怪奇物语》&#xff08;Stranger Things&#xff09;第四季视效剧情口碑双爆棚&#xff0c;无疑是2022年最值得一看的现象级剧集之一。第四季共九集&#xff0c;分上下两部&#xff0c;分别在今年5月和7月上线&#xff0c;目前豆瓣评分已经稳…

分享知识付费系统变现的方式_知识付费系统开发步骤

一、知识付费赚钱的方式 首先给大家讲讲知识付费赚钱的两大方式&#xff0c;大家可以根据自己的情况来选择做哪种。 1、自己做知识付费赚钱 自己做知识付费需要自己有一套成熟的理念观点&#xff0c;能输出成优质的内容传授给他人。可以将自己的知识技能制作成音频、视频、图…

【Python】三、内置函数

文章目录实验目的一、abs()二、int() / float() / str() / pow()1、int()2、float()3、str()4、pow()三、len() / id() / type()1、len()2、id()3、type()四、编写程序&#xff0c;实现输入一个正的实数x&#xff0c;分别输出x的整数部分和小数部分。1.设计思路2.设计算法3.参考…

南芯科技在科创板提交注册:业绩增速迅猛,股东包括红杉、顺为等

近日&#xff0c;上海南芯半导体科技股份有限公司&#xff08;下称“南芯科技”&#xff09;在上海证券交易所科创板递交招股书&#xff08;注册稿&#xff09;。据贝多财经了解&#xff0c;南芯科技于2022年6月21日在科创板递交上市申请&#xff0c;11月18日获得上市委会议通过…

堆(堆排序和模拟堆)

如何手写一个堆 下标从1开始&#xff0c;如果从0开始的话&#xff0c;他的左儿子的下标就等于0*2 0&#xff0c;麻烦 手写堆可以实现的操作&#xff1a;1&#xff0c;插入一个数 2&#xff0c;求集合当中的最小值 3&#xff0c;删除最小值 4&#xff0c;删除任意一个元素…

基于樽海鞘群算法的线性规划求解matlab程序

基于樽海鞘群算法的线性规划求解matlab程序 1 樽海鞘群优化算法 1.1 生物启示 通过研究海底生物樽海鞘在觅食过程中群体呈链状向食物方向移动的行为活动&#xff0c;学者Mirjalili在2017年提出的一种新型启发式仿生算法—樽海鞘群智能优化算法&#xff08;Salp Swarm Algori…

javascript三种事件模型 + Dom事件流 +事件委托

目录三种事件模型● DOM0 级模型&#xff1a;● IE 事件模型&#xff1a;● DOM2 级事件模型&#xff1a;DOM事件流事件委托target/currentTarget/relateTarget的区别三种事件模型 ● DOM0 级模型&#xff1a; 这种模型不会传播&#xff0c;所以没有事件流的概念&#xff0c;…

Golang远程调试Debug环境

目录背景软件版本环境搭建安装Golang环境安装dlv环境启动远程环境Goland 连接远程环境参考背景 最近在做 Operator 的二次开发&#xff0c;开发语言是Golang。Operator 开发时候需要用到k8s集群&#xff0c;遗憾的是k8s编排的容器网络与本地网络不通&#xff0c;无法直接进行d…

十部必看特种部队电影之《勇者行动》

这部特种部队题材电影是馆长收藏了很久的网盘资源&#xff0c;今天拿出来分享给大家。