服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - 编程技术 - 如何设计一个几十万在线用户弹幕系统需求方案

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

2023-05-09 15:12我是小趴菜 编程技术

这篇文章主要介绍了为大家如何设计一个几十万在线用户弹幕系统的需求实现方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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:总结

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

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

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

原文链接:https://juejin.cn/post/7223055227465056314

延伸 · 阅读

精彩推荐
  • 编程技术一篇带给你 Serverless 云开发高阶应用

    一篇带给你 Serverless 云开发高阶应用

    在 FaaS 平台中,函数默认是不运行的,也不会分配任何资源,甚至 FaaS 中都不会保存函数代码。只有当 FaaS 接收到触发器的事件后,才会启动并运行函数。...

    勾勾的前端世界4742021-04-19
  • 编程技术一款Kafka可视化Web界面管理工具:CMAK

    一款Kafka可视化Web界面管理工具:CMAK

    今天跟大家介绍其中一款可视化Web界面管理工具,它就是kafka-manager,不过现在更名为CMAK。...

    testerzhang9472021-12-24
  • 编程技术开发者的胜利:GitHub 恢复了 youtube-dl 库

    开发者的胜利:GitHub 恢复了 youtube-dl 库

    GitHub 现已恢复了对 YouTube 视频流媒体和下载软件 youtube-dl 的访问权限。上月,为响应美国唱片业协会 RIAA 的 DMCA 删除请求,Github 删除了 youtube-dl 的代码,...

    开源中国1732020-11-18
  • 编程技术详解inet_pton()和inet_ntop()函数

    详解inet_pton()和inet_ntop()函数

    这篇文章主要介绍了inet_pton()和inet_ntop()函数,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    乐乐敲代码5362020-09-15
  • 编程技术这还是我最熟悉的package.json吗?

    这还是我最熟悉的package.json吗?

    npm 的配置还是挺多的,具体可以参考package.json官方文档[2]。通读了文档之后,我略过了一些基础的配置项,总结了一些我认为比较有用的配置项。...

    前端司南10362021-04-23
  • 编程技术7个管理家目录的 Git 技巧

    7个管理家目录的 Git 技巧

    用 Git 管理我的家目录是一个不断发展的过程。随着时间的推移我一直在学习和适应。如果你决定使用 Git 管理家目录,则可能需要记住以下几点。...

    Linux中国11762021-04-20
  • 编程技术通过代码实例了解页面置换算法原理

    通过代码实例了解页面置换算法原理

    这篇文章主要介绍了通过代码实例了解页面置换算法原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    七月在野,八月在宇10752021-01-24
  • 编程技术新版DevEco不用USB线下载程序

    新版DevEco不用USB线下载程序

    因为使用type-c线下载程序非常麻烦,而且占用电脑USB口,在调试碰一碰的时候非常麻烦,然后我在鸿蒙开发者文档中意外发现了一种无线下载程序的办法。...

    鸿蒙社区8692021-11-12