【架构设计】如何设计一个几十万在线用户弹幕系统

2023-10-24 10:50

本文主要是介绍【架构设计】如何设计一个几十万在线用户弹幕系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、前言
  • 二、项目介绍
    • 客户端轮询
    • WebSocket主动推送
  • 三、弹幕初始架构
  • 四、弹幕架构演进
  • 五、弹幕存储
  • 六、弹幕查询
  • 七、总结

一、前言

现在无论是直播还是电视剧,我们都可以看到上面慢慢的弹幕,满足十几万用户在线的弹幕系统,我们该如何去设计呢?

二、项目介绍

弹幕跟我们平时做的系统不太一样,平时做的最多的就是客户端发起请求,也就是数据都是由客户端推送到服务端,但是弹幕是由服务端推送给客户端的。

比如我们现在在看直播,很多用户都会发送弹幕,然后每个在线的用户都可以收到这条弹幕信息。

这时候我们有二种方案

客户端轮询

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

WebSocket主动推送

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

三、弹幕初始架构

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

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

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

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

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

四、弹幕架构演进

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

所以第二个难点就在这了
在这里插入图片描述

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

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

五、弹幕存储

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

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

六、弹幕查询

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

七、总结

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

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

思考:基于netty框架如何实现?大家可以思考!对于这个方案还有什么不足的地方,欢迎大家提出,一起进步。

这篇关于【架构设计】如何设计一个几十万在线用户弹幕系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/u011397981/article/details/130219915
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/274630

相关文章

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

使用Python和SQLAlchemy实现高效的邮件发送系统

《使用Python和SQLAlchemy实现高效的邮件发送系统》在现代Web应用中,邮件通知是不可或缺的功能之一,无论是订单确认、文件处理结果通知,还是系统告警,邮件都是最常用的通信方式之一,本文将详... 目录引言1. 需求分析2. 数据库设计2.1 User 表(存储用户信息)2.2 CustomerO