android 高并发弹幕,高并发实时直播弹幕研发实践

高并发实时直播弹幕研发实践

直播间特点

4d561ae4da034cc7d401faec9a44730d.png

聊天室限制人数的原因

4aa9818c7585370bc8ab212407a1526a.png

应对万级以上的实时互动

fb0fa4f8452f9c9f894c12dbb9cb9e62.png

跨服务器是为了解决单一服务器接入数量限制、发布消息吞吐限制等问题;

多进程并发则是为了充分利用多核CPU以及减小一个循环规模从而达到降低延迟的目的。

云巴实时系统的设计

云巴是基于MQTT协议实现的实时通信系统,采用Erlang/OTP的架构设计。简单地来说,云巴实时系统的设计包括多层结构、微服务两个要点。

多层结构

cb52db2444841b2da4cee5f3119675e6.png

云巴系统设计中,多层结构意味着一个基本业务逻辑的完成需要经历多个模块(如图上所示)。

云巴多层结构设计有三个主要特点:

- 所有模块均可独立运行,互不干扰。 任一模块在运行的过程中,无需依赖其他模块。除此以外,还会对所有模块设立在线监控,从而实现生产状态下的实时告警。同时,模块独立运行还能够达到持续集成的效果;

细粒度扩容,包括但不限于对接入进行扩容等;

使用「隔离」。 顾名思义,系统可以为用户指定特定的路径,也可以在某些路径出现问题以后,强行从系统里摘除路径,达到「隔离」效果。

微服务化

f93bac7bd4b8aa685bfeb2c05ee0ebdf.png

虽然近期微服务已一个新兴事物的身份被广泛讨论,但其实,微服务可以算是一个老 概念了。

比如Erlang/OTP就是一个成熟已久的典型微服务架构。其作为微服务架构的特点就在于业务逻辑非常简单的同时,并发量也非常高。

云巴采用的正是Erlang/OTP的架构设计,在微服务化的方面的体现则是将业务逻辑封装成一个RPC Service,以及RPC Service部署微一个OTP Worker。

云巴实时系统的特点

云巴实时系统的设计特点主要有:拥有海量轻量级任务、任务与运行位置无关以及水平扩展。任务与运行位置无关,这就意味着在任务池中,可以动态地把任务调度到不同物理机上,同时数据要存储在独立集群中。

海量的轻量级任务包括长连接创建的任务、用户请求产生时创建的任务。

299b8c3626e962cb19da29ff2369ba0b.png

长连接任务即为,当一个长连接接入时,系统会创建一个任务来管理和维持长连接;

同样地,请求任务则是,当一个用户请求(比如发送一条弹幕)产生时,就会创建一个任务来管理该请求。

f5e5e5e70d6ef26b859ae59373f70018.png

对于云巴来讲,不论是用户加入了一个直播间还是发送了一条弹幕,都可以以Pub/Sub模型来实现。Pub/Sub模型中比较重要的词汇为「publish」、「subscribe」以及「unsubscribe」。

比如,一个用户进入了一个直播间,则可以视为订阅(subscribe)了该直播间;

进入之后在直播间发送弹幕,视为向这个直播间发送(publish)了一条消息;

而由于进入直播间的用户都已经订阅过该直播间,所以其他用户都看到了这条弹幕。

一旦用户退出了直播间,则视为取消订阅(unsubscribe)了直播间,再也收不到该直播间里面其他用户发布的弹幕了。

传统的消息发布过程

传统的消息发布过程有两种,第一种是遍历列表里的每一个UID,读取路由,逐一发送消息;

第二种是遍历每一台服务器,发送消息,然后将订阅关系保存在每一台服务器内。以上两种做法都有可能导致延迟过多的问题。

云巴的消息发布过程

1a919e604adad5e54e3b7e01282ac1d3.png

在云巴,消息的发布过程为,首先在接收到任务请求后,会发布任务计算UID列表分片,对总任务进行分片处理。之后将分片任务分发给任务池,执行各个分片任务。最后,发布任务汇聚请求,返回所有的分片任务。

「分片」——「汇聚」设计的好处在于,可以有效控制最大延迟。目前云巴是将此整个过程控制在200ms以内。除此以外,还能够扩大任务池,提升系统并发能力。

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

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

相关文章

linux python3_在Linux上安装Python 3

在Linux上安装Python 3这份文档描述了如何在Ubuntu Linux机器上安装Python 3.6。 想要获取已安装的Python 3版本号,可以通过终端运行命令: $ python3 --version 如果您使用的是Ubuntu 16.10或更新,可以通过以下命令简单地安装Python 3.6: $ s…

android手机电话铃声设置,安卓手机铃声怎么设置

网上有很多安卓手机铃声的设置教程,说什么SD卡里建立这个那个的文件夹,那问题是怎么才能进到SD卡里去建立文件夹啊?手机里哪个选项里进去呢?这里小编告诉你,可以通过电脑连接数据线管理SD卡。下面介绍两种简单的设置安…

安装squid_「首席推荐」设置Squid转发代理或者正向代理

如果您正在阅读这篇文章,您可能会因为缺少与Squid相关的信息而感到沮丧,Squid是一种非常流行的转发代理。这些令人沮丧的事情包括:在小的软件修订之后出现的重大的可用性变化,对幕后发生的事情的误解,以及真正糟糕的文档。这是一个…

android区域截图app,【干货】最新App应用市场截图尺寸大全

今天给大家分享最新的干货,刚好碰上这段时间设计市场截图,所以给各位设计新人,分享本人整合的尺寸大全,希望对你们的设计之路有所帮助。一、IOS App Store尺寸尺寸(机型) 大小(px)3.5寸(iphone4/4s)…

2018python做图形界面哪个库简单_2018年常见的python编程开发库都有哪些类型

python编程开发可以说是目前比较热门的一项编程开发语言了,而今天我们就一起来了解一下,关于python编程都有哪些常见的python库可以使用。1、TensorFlow “TensorFlow是一个使用数据流图进行数值计算的开源软件库。图形节点表示数学运算,而图…

c++ socket线程池_java 网络编程,Socket编程

Java的网络编程主要涉及到的内容是Socket编程,那么什么是Socket呢?简单地说,Socket,套接字,就是两台主机之间逻辑连接的端点。TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应…

android签名忘记密码,修改Android签名证书keystore的密码、别名alias以及别名密码

之前在测试Eclipse ADT的Custom debug Eclipse ADT的Custom debug keystore所需证书规格,提到过自定义调试证书的密码和1. 首先当然是先复制一份正式证书出来作为要修改为的临时调试证书。2. 修改keystore密码的命令(keytool为JDK带的命令行工具):keytoo…

识别物体是否存在_【科学实践Vol.1】带你玩转“人脸识别”

随着时代的发展,人脸识别在我们的生活中变得随处可见:商场里的人脸识别储物柜,校园里的人脸识别刷卡机,手机里的面部解锁……这些应用极大的便利了我们的日常生活。今天,就让我们一起走进人脸识别的原理世界。首先我们…

html 自动适应手机屏幕大小,HTML5 canvas自适应手机屏幕大小的一种解决方案

一、最终效果为了不浪费大家时间,先展示最终效果,看看是不是大家需要的解决方案:标准分辨率:其他分辨率的适配情况:二、需求1.canvas的内容能全部展示在屏幕上2.尽量能保证图像不变形3.绘制的文字也能自适应三、解决方…

编写一个能够排序的函数模板。_LeetCode刷题——9.给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合...

难度(medium)题目描述:给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。例如n3,解集为: "((()))", "(()())", "(())()", "()(())", "()()()" 思路&#xf…

html5怎么产生手风琴效果,Html5 js如何实现手风琴效果

Html5 js如何实现手风琴效果发布时间:2020-08-03 09:54:10来源:亿速云阅读:92作者:小猪这篇文章主要为大家展示了Html5 js如何实现手风琴效果,内容简而易懂,希望大家可以学习一下,学习完之后肯定…

c++进制转换_一文了解进制之间的原理和转换

点击这段文字: 获取2020年,最强Python学习资料进制这块,可以做简单的了解。生活中我们使用的数字都是十进制的,而二进制是机器能够识别的最直接的语言。但是二进制又太大,记录起来非常的不方便。所以通常会将二进制转化…

用HTML做一个简单的web登录页面,简单的JavaWeb注册登录案例

简单的JavaWeb注册登录案例1.注册页面register.htmlregister姓名:电话:邮箱:qq:2.注册案例实现程序register.java/*** 注册案例实现程序* author lucky**/public class register extends HttpServlet {public void doGet(HttpServ…

一层循环时间复杂度_算法的时间与空间复杂度(一看就懂)

算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢&…

用ajax替换html代码,替换Ajax响应一个div的内部HTML(Replace inner HTML of a div w

我试图一些时间间隔后改变一个div的内部HTML。 我得到我想要使用Ajax正确的反应。 但无法取代内HTML的后,并用Ajax响应地选择。 什么是错我的代码..HTML51 seconds ago58 seconds ago.....10 minute agoĴ查询setInterval(function() {$( ".time" ).each(…

java 审批流_一文读懂工作流

网上关于工作流引擎有比较多的简介,也有很多工作流的实际应用场景。本文结合笔者多年对工作流的经验来阐述一下对工作流的理解。一、什么是工作流?先贴上wiki百科对于工作流的定义工作流(Workflow),是对工作流程及其各…

postgresql 查询序列_时间序列数据库(TSDB)初识与选择

作者:码哥字节 如需转载联系我的公众号背景 这两年互联网行业掀着一股新风,总是听着各种高大上的新名词。大数据、人工智能、物联网、机器学习、商业智能、智能预警啊等等。以前的系统,做数据可视化,信息管理,流程控制…

concurrenthashmap实现原理_Mybatis:PageHelper分页插件源码及原理剖析

PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美。原本以为分页插件,应该是很简单的,然而PageH…

计算机网络dst,计算机网络基础课程—Socket接口

什么是TCP/IP------本课程的主要部分TCP/IP如何工作-----TCP/IP软件结构与实现如何用TCP/IP-------TCP/IP应用程序编程接口前面说过,TCP/IP标准并不指定应用程序与TCP/IP协议软件的接口,但并不是说没有提供任何指导,首先,它指定了…

python输入圆的半径公式_[图文]铁路曲线正矢的计算公式

一、圆曲线正矢的计算1.1 圆曲线正矢的计算公式取圆曲线上两点拉一直线,叫做弦。弦上任意点至曲线上的垂直距离叫矢或叫矢距。在弦中央点的矢距叫正矢(下图)。AB一弦;AC、CB一半弦;CD一正矢;EF一矢距正矢计算公式为其中: f-正矢 C-弦长 R-半径 式中单位均为m。公式用文字表示即…