如何设计一个几十万在线用户弹幕系统需求方案

 更新时间:2023年05月08日 11:47:43   作者:我是小趴菜  
这篇文章主要介绍了为大家如何设计一个几十万在线用户弹幕系统的需求实现方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>

1: 需求背景

现在无论是直播还是电视剧,我们都可以看到上面慢慢的弹幕,如果有一天公司自己要做一个这样的满足十几万用户在线的弹幕系统,我们该如何去设计呢

2 技术选型

弹幕跟我们平时做的系统不太一样,平时做的最多的就是客户端发起请求,也就是数据都是由客户端推送到服务端,但是弹幕是由服务端推送给客户端的。比如我们现在在看直播,很多用户都会发送弹幕,然后每个在线的用户都可以收到这条弹幕信息。这时候我们有二种方案

2-1: 客户端轮训

也就是客户端不停的去服务端去拉取数据,但是会有一个弊端,因为我们每次看电视剧的时候,看一遍一条弹幕只会显示一次。如果不停的去轮训,会有很多无效的请求,而且不停的去轮训无疑会给服务器造成很大的压力,因为你客户端少,如果现在有十几万的客户端同时在线,那么服务器每隔一段时间就会有几十万次的查询压力。

2-2: WebSocket主动推送

随着现在IM系统的成熟,WebSocket也越来越被重视,WebSocket在当服务器收到消息之后,可以主动将消息推送给客户端。

3: 弹幕初始架构

在开始的时候,因为用户不多,我们只有一台服务器,也能满足需求,但是试想一下,如果某一天用户增多了,你这一台服务器真的顶得住十几万的用户来访问吗???

既然这时候一台服务器压力太大,那我们就部署多台服务器,将压力进行分摊,这样每台服务器的压力就不会那么大

但是这时候单台服务器压力是解决了,那推送消息给每一个用户就做不到了,我们知道WebSocket在推送消息的时候,会先拿到这个用户的Session,然后通过这个Session将消息推送给这个用户,但是用户Session都是保存在我们本地服务中的。比如这个用户A的Session在服务器A上,用户B在服务器B上,那么你怎么拿到用户B的Session呢?

很多人会说,把所有用户的Session都保存到Redis中不就可以了,其实这样也不是不行,但是如果你现在有几百万,几千万的用户Session呢?

所以我们可以使用消息中间件或者Redis的发布订阅模式,比如使用消息中间件RocketMq,有一个用户发送了一条弹幕,那么就发送一条消息到MQ中,所有服务都接受到这条消息之后,然后就可以拿到本地所有用户的Session,再进行发送。

4:弹幕架构演进

不知道大家有没有想过这样一个问题,假设我们现在有10台服务器,每台服务器有一万人,这时候,一个人发送一条弹幕,那么每台服务器WebSocket都要推送一万次消息到客户端,如果这时候有一万人发送了弹幕呢?那么WebSocket是不是就要推送 1万 * 1万次数据呢。在这种高并发的情况下,WebSocket会因为发送的太频繁导致各种各样的问题,比如与客户端断开连接等。

所以第二个难点就在这了

现在我们把所有需要推送的消息都发送到MQ中,然后在MQ中将消息推送给客户端。为什么要这么做呢?

在MQ中我们可以进行限流,这样WebSocket就不用频繁的去操作了。尤其类似于弹幕这种业务,也不是说要求实时的。一般我们发送一条弹幕,都会过个几秒钟我们自己才能看见,所以我们可以根据自己服务器的性能来决定消费速度。

5:弹幕存储

用户发送的弹幕最终都是要进行持久化存储的,就像腾讯视频一样,无论你什么时候去看,那些弹幕都还在。那么弹幕存储时机是什么时候呢???

一般都会选择在用户发送一条弹幕之后就存储这条弹幕,如果用户发送一条弹幕我们就同步的将这条数据存储到MySql中,那么这时候有几十万的弹幕该怎么办? 这时候数据库的压力就很大了。因为弹幕这种数据丢个几条对我们业务没有任何影响,所以我们可以选择异步存储,比如将要保存弹幕信息发送到MQ,MQ异步的将消息存储到MySql中即可

6:弹幕查询

对于弹幕查询,我们后续可以将数据同步到搜索引擎Elasticsearch中,后续的查询就直接查ES就好,就不用查数据库,避免对数据库造成压力。

7:总结

对于弹幕系统来说,难点就在于二个,

  • 第一:对于大量消息推送到客户端
  • 第二:就是消息的异步存储了

以上就是如何设计一个几十万在线用户弹幕系统方案的详细内容,更多关于几十万在线用户弹幕系统的资料请关注脚本之家其它相关文章!

相关文章

  • 为Jenkins创建定时构建任务

    为Jenkins创建定时构建任务

    这篇文章介绍了为Jenkins创建定时构建任务的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • 算法系列15天速成 第一天 七大经典排序【上】

    算法系列15天速成 第一天 七大经典排序【上】

    今天是开篇,得要吹一下算法,算法就好比程序开发中的利剑,所到之处,刀起头落
    2013-11-11
  • 利用git提交代码的方法步骤

    利用git提交代码的方法步骤

    这篇文章主要介绍了利用git提交代码的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • IDEA Git Stash 使用详解

    IDEA Git Stash 使用详解

    这篇文章主要介绍了IDEA Git Stash 使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • gVim, gVim Easy, gVim Read-only 的简单区别

    gVim, gVim Easy, gVim Read-only 的简单区别

    今天打算好好学习一下python,买了一本书看了介绍无语了,gVim, gVim Diff, gVim Easy, gVim Read-only 的简单区别,需要的朋友可以参考下
    2016-01-01
  • git分支的创建、切换、合并及删除操作小结

    git分支的创建、切换、合并及删除操作小结

    这篇文章给大家详细的介绍了关于git分支的操作,其中包括查看现存分支、创建分支、切换分支、提交分支、分支合并以及删除分支,文中给出了详细示例代码,相信对大家的学习和理解很有帮助,有需要的朋友们下面来一起学习学习吧。
    2016-11-11
  • 文本文件编码方式区别

    文本文件编码方式区别

    当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。
    2008-09-09
  • 访客站点停留时间和页面停留时间的实现方案

    访客站点停留时间和页面停留时间的实现方案

    这篇文章主要介绍了访客站点停留时间和页面停留时间的实现方案,需要的朋友可以参考下
    2015-01-01
  • 使用Postman测试需要授权的接口问题

    使用Postman测试需要授权的接口问题

    Postman是一款免费的http模拟请求工具,常用来测试开发接口。实际场景中,很多接口是需要授权才能使用,这篇文章主要介绍了用Postman测试需要授权的接口,需要的朋友可以参考下
    2022-06-06
  • yum安装telnet的步骤

    yum安装telnet的步骤

    Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式,Telnet是常用的远程控制Web服务器的方法,本文给大家分享yum安装telnet的步骤,感兴趣的朋友一起看看吧
    2020-05-05

最新评论