如何实现百万级的语音聊天室

htkfsy htkfsy     2023-04-23     664

关键词:

上篇我们介绍了如何从零开始搭建一套语音聊天室后台,设计方案比较基础,本篇我们将介绍语音聊天室的升级版本——在海量用户同时在线的情况下,语音服务器的架构将如何升级改造。

互联网产品后台开发信奉一句话:先扛住再优化。工程师当然是希望把系统设计得尽善尽美,但是业务发展往往是不允许的,因此后台工程师的工作就是在技术和业务之间寻找平衡点。大部分的系统都是逐步迭代演进而来的,没有一蹴而就的完美系统。

前文中,我们介绍了语音服务器分SET部署的概念。其实一直在回避一个问题,分SET的缺点是什么?

分SET限制了房间的容量。因为不分SET还好,分SET了以后一个房间撑死只能达到20万的用户,这样看起来分SET是一个不合理的设计。真是这样吗?

当然不是。所谓万丈高楼平地起,基础架构是非常重要的。虽然分SET为我们带来了一个限制,但是它的好处是更明显的。首先,我们的业务场景就决定了百万级别的房间是不常见,我们负责的超过20万用户在线的直播也就只有大型的游戏赛事直播,而且这种直播一年也就那么几回。其次,前面已经说过,如果不分SET,应对百万用户房间,需要50台机器,每次发布出错的影响面远大于分SET部署。

因此,我们要讨论的不是分不分SET的问题,而是怎么在分SET的情况下,实现百万房间的问题。

最容易想到的方案是把100万用户分到5个SET里。那多个SET之间怎样通信呢?方法说白了就是为不同SET中的服务器提供一个全局视图,用于转发路由。方法有很多种,这里介绍2种思路。

第一种是在房间服务器的上面再增加一个组服务器(group server),为系统提供全局视野。组服务器在每个SET的语音服务器中选取一台做为桥头堡机器(broker),跨SET转发和接收都通过broker完成。Broker收到SET内转发时,会将数据转发给其他SET的broker;而当收到跨SET转发时,会将数据转发给SET内的其他机器。

 技术图片

 

这种方案的缺点是broker会成为瓶颈,当broker宕机时,最严重的情况是造成其他SET无法提供服务。容灾策略一种是减少broker到组服务器的心跳间隔,使组服务器可以迅速发现异常并重新挑选broker;另一种方法是采用双broker,不过会增加数据去重的复杂度。

第二种是在系统之外增加一个转发服务器,专门负责跨SET转发,当然它本身拥有全局视野。这种方案其实是把上面说的组服务和双broker结合在一起,把转发功能外化。对于跨SET房间,主播所在的语音服务器做SET内转发的同时将数据发给转发服务器,转发服务器根据房间信息将数据转发给其他SET的任意1台机器。

 技术图片

这样优点非常明显,转发服务器跟原有系统完全解耦,原系统改造也很小,可以实现高可用。唯一缺点是转发服务器起码有两台机器,也会增加接收方数据去重的复杂度。

现在我们梳理一下,要实现一个支持百万级的语音聊天房间,整体的架构如下所示:

技术图片 

  1. 用户创建房间。通过目录服务器创建,实际上是在数据库中增加一条set_id和room_id的映射记录。
  2. 用户请求进入房间。通过目录服务器查询应该连到哪台语音服务器,具体的逻辑由负载均衡服务器实现。简单描述为:查询到room_id所在的set的所有语音服务器,根据负载情况和就近接入原则,选择几台语音服务器的ip和端口返回。
  3. 用户进入房间。客户端连接语音服务器,语音服务器将进房请求透传给房间服务器,房间服务器记录房间架构信息,并定期同步给set内所有的语音服务器。
  4. 对于小房间,通过set内转发语音实现。

对于跨set的大房间,由多个房间服务器协同工作实现。房间服务器之间不需要互相通信,它们只要在set内按规则挑选一台语音服务器作为broker。Broker收到语音数据时,除了常规的set内转发外,还将数据发给转发服务器。转发服务器知道房间所在的set列表和每个set的broker,从而实现跨set转发。

    本篇主要介绍了基于分SET架构如何实现百万级房间的设计方法,并梳理了语音聊天室的整体架构。希望对大家有所帮助。

如何使用netty技术设计一个百万级的消息推送系统原荐(代码片段)

先简单说下本次的主题,由于我最近做的是物联网相关的开发工作,其中就不免会遇到和设备的交互。最主要的工作就是要有一个系统来支持设备的接入、向设备推送消息;同时还得满足大量设备接入的需求。所以本次分享的内... 查看详情

一篇文章教你如何设计一个百万级的消息推送系统(代码片段)

前言先简单说下本次的主题,由于我最近做的是物联网相关的开发工作,其中就不免会遇到和设备的交互。最主要的工作就是要有一个系统来支持设备的接入、向设备推送消息;同时还得满足大量设备接入的需求。所以本次分享... 查看详情

设计一个百万级的消息推送系统(代码片段)

原文:设计一个百万级的消息推送系统前言首先迟到的祝大家中秋快乐。最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实... 查看详情

设计一个百万级的消息推送系统(代码片段)

原文链接:https://crossoverjie.top/2018/09/25/netty/million-sms-push/前言首先迟到的祝大家中秋快乐。最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。鉴于最近我个人的工作内容,于是利用这三天小长假憋... 查看详情

设计一个百万级的消息推送系统----转

技术选型要满足大量的连接数、同时支持双全工通信,并且性能也得有保障。在Java技术栈中进行选型首先自然是排除掉了传统 IO。那就只有选NIO了,在这个层面其实选择也不多,考虑到社区、资料维护等方面最终选择了Netty... 查看详情

设计一个百万级的消息推送系统(代码片段)

原文地址:https://my.oschina.net/crossoverjie/blog/2208192前言首先迟到的祝大家中秋快乐。最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出... 查看详情

设计一个百万级的消息推送系统(代码片段)

前言首先迟到的祝大家中秋快乐。最近一周多没有更新了。其实我一直想憋一个大招,分享一些大家感兴趣的干货。鉴于最近我个人的工作内容,于是利用这三天小长假憋了一个出来(其实是玩了两天??)。先简单说下本次的主... 查看详情

mysql百万级分页优化

...码代码如下:SELECT*FROMtableORDERBYidLIMIT1000,10; 但在数据达到百万级的时候,这样写会慢死 复制代码代码如下:SELECT*FROMtableORDERBYidLIMIT1000000,10; 也许耗费几十秒 网上很多优化的方法是这样的 复制代码代码如下:SELECT* 查看详情

mysql百万级的表怎么处理

参考技术A对大数据的数据库管理优化的总结:常用的优化sql----突出快字,使完成操作的时间最短1、用索引提高效率:2、选择有效率的表名顺序,及数据结构及字段;3、使用DECODE函数可以避免重复扫描相同记录或重复连接相同... 查看详情

《重学java高并发》disruptor是如何做到百万级吞吐?

...队列,官方宣传能达到百万级吞吐,那disruptor是如何做到的呢?其核心秘诀如下:破除伪共享对象池无锁化设计批处理上面这些观点,网上已经提了N遍,没关系,本文将结合代码、图解的方式,与... 查看详情

《重学java高并发》disruptor是如何做到百万级吞吐?

...队列,官方宣传能达到百万级吞吐,那disruptor是如何做到的呢?其核心秘诀如下:破除伪共享对象池无锁化设计批处理上面这些观点,网上已经提了N遍,没关系,本文将结合代码、图解的方式,与... 查看详情

《重学java高并发》disruptor是如何做到百万级吞吐?

...队列,官方宣传能达到百万级吞吐,那disruptor是如何做到的呢?其核心秘诀如下:破除伪共享对象池无锁化设计批处理上面这些观点,网上已经提了N遍,没关系,本文将结合代码、图解的方式,与... 查看详情

javamysql实现jdbc百万级数据插入

因为公司项目需要做一个excle快速导入到mysql功能,之前已经解决Java读取excle文件,但是因为文件有100w+的数据,插入mysql数据库很慢,1小时10w条,必须要做优化,后面写了批量插入1000条y一个批,但是速度还是很慢,查看数据库... 查看详情

3年3款产品百万级增长方法论

...;从工具产品、内容产品再到社交产品,最终都收获了百万级的增长。这个过程中我深感增长方法之可拓展性:无论是做什么产品,都离不开做留存、做规模、做营收;通过增长这套科学的方法,我们可以快速... 查看详情

干货满满:基于shardingsphere实现动态数据源

...,当查询数据的时候,需要保证数据的及时响应。那么,如何保证这些海量数据的安全可靠,以及实时查询呢?当然,这里肯定会有很多解决方案。在当下大数据时代,出现了很多比较友好的解决方案和框架可以解决这个问题。... 查看详情

excel数据量较多(百万级)如何进行汇总和筛选处理?

数据非常简单,但是量比较多,就需要按照每一天出现的问题类型进行分类(问题就那几种),源数据量比较多,一天都有20多万条。如果就只有一天的,用透视表直接就可以筛出来了,但是要每天每天的累加在一起,所以就比... 查看详情

百万级数据excel导出功能如何实现?(代码片段)

...慢。相同商品编号的数据要放到一起。如果走异步,如何通知用户导出结果?如果excel文件太大,目标用户打不开怎么办?我们要如何才能解决这些问题,实现一个百万级别的excel数据快速导出功能呢?1.异... 查看详情

在一个千万级的数据库查寻中,如何提高查询效率?

在一个千万级的数据库查寻中,如何提高查询效率? 1)数据库设计方面: a、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。 b、应尽量避免在where子句中对字段进行null值判断... 查看详情