srs 边缘集群

srs官方关于边缘集群的介绍:

Edge Cluster | SRS

本篇分析一下边缘集群中上行边缘节点的处理逻辑。

关于上行的边缘节点:

SRS对于上行边缘,采取直接代理方式,并没有采取边缘缓存方式。所谓边缘缓存方式,即推流到边缘时边缘也会当作源站直接缓存(作为源站),然后转发给源站。边缘缓存方式看起来先进,这个边缘节点不必回源,实际上加大了集群的逻辑难度, 不如直接作为代理方式简单。

上行边缘SrsPublishEdge

上行边缘只做代理,收到流后直接转给源站

srs_error_t SrsRtmpConn::process_publish_message(SrsLiveSource* source, SrsCommonMessage* msg)
{srs_error_t err = srs_success;//对于边缘edge,收到流后直接发给源站// for edge, directly proxy message to origin.if (info->edge) {if ((err = source->on_edge_proxy_publish(msg)) != srs_success) {return srs_error_wrap(err, "rtmp: proxy publish");}return err;}
}// TODO: FIXME: Use edge strategy pattern.
srs_error_t SrsLiveSource::on_edge_proxy_publish(SrsCommonMessage* msg)
{return publish_edge->on_proxy_publish(msg);
}
//消息转给forwarder模块,即:SrsEdgeForwarder类
//该类在SrsPublishEdge的构造函数中进行初始化
//并且在收到publish消息时,开启一个协程去队列中读取数据
srs_error_t SrsPublishEdge::on_proxy_publish(SrsCommonMessage* msg)
{return forwarder->proxy(msg);
}srs_error_t SrsEdgeForwarder::proxy(SrsCommonMessage* msg)
{srs_error_t err = srs_success;if (send_error_code != ERROR_SUCCESS) {return srs_error_new(send_error_code, "edge forwarder");}//...//...SrsSharedPtrMessage copy;if ((err = copy.create(msg)) != srs_success) {return srs_error_wrap(err, "create message");}//forward模块收到消息后把消息放到队列中copy.stream_id = sdk->sid();if ((err = queue->enqueue(copy.copy())) != srs_success) {return srs_error_wrap(err, "enqueue message");}return err;
}

SrsEdgeForwarder转发消息给源站

真正的业务场景中,一般源站会部署多台组成一个集群,所以当一个边缘收到流后,需要选择向集群中的哪台源站进行推流。srs选取源站的负载均衡算法是RoundRobin

string SrsLbRoundRobin::select(const vector<string>& servers)
{srs_assert(!servers.empty());index = (int)(count++ % servers.size());elem = servers.at(index);return elem;
}
//通过负载均衡算法选取了源站后,边缘节点会创建一个rtmp client然后把流转推给该源站节点
srs_error_t SrsEdgeForwarder::start()
{std::string url;if (true) {//从配置文件中读取源站地址列表SrsConfDirective* conf = _srs_config->get_vhost_edge_origin(req->vhost);srs_assert(conf);//通过 roundrobin算法选取合适的源站节点// select the origin.std::string server = lb->select(conf->args);int port = SRS_CONSTS_RTMP_DEFAULT_PORT;srs_parse_hostport(server, server, port);// support vhost tranform for edge,std::string vhost = _srs_config->get_vhost_edge_transform_vhost(req->vhost);vhost = srs_string_replace(vhost, "[vhost]", req->vhost);//生成向源站推流所用的url地址url = srs_generate_rtmp_url(server, port, req->host, vhost, req->app, req->stream, req->param);}//创建一个rtmp client向源站推流sdk = new SrsSimpleRtmpClient(url, cto, sto);if ((err = sdk->connect()) != srs_success) {return srs_error_wrap(err, "sdk connect %s failed, cto=%dms, sto=%dms.", url.c_str(), srsu2msi(cto), srsu2msi(sto));}// For RTMP client, we pass the vhost in tcUrl when connecting,// so we publish without vhost in stream.string stream;if ((err = sdk->publish(_srs_config->get_chunk_size(req->vhost), false, &stream)) != srs_success) {return srs_error_wrap(err, "sdk publish");}
}

SrsEdgeForwarder协程中发送

srs_error_t SrsEdgeForwarder::do_cycle()
{while (true) {if ((err = trd->pull()) != srs_success) {return srs_error_wrap(err, "edge forward pull");}// forward all messages.// each msg in msgs.msgs must be free, for the SrsMessageArray never free them.//首先从队列中取出要发送的消息int count = 0;if ((err = queue->dump_packets(msgs.max, msgs.msgs, count)) != srs_success) {return srs_error_wrap(err, "queue dumps packets");}//通过sdk把数据发给源站节点// sendout messages, all messages are freed by send_and_free_messages().if ((err = sdk->send_and_free_messages(msgs.msgs, count)) != srs_success) {return srs_error_wrap(err, "send messages");}}
}

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

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

相关文章

操作系统概念

一、概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括&#xff1a; 内核&#xff08;进程管理&#xff0c;内存管理&#xff0c;文件管理&#xff0c;驱动管理&#xff09;其他程序&#xff08;例如函数库&…

区块链技术和Hyperledger Fabric介绍

1 区块链介绍 1.1 区块链技术形成 1.1.1 起源 在比特币诞生之时&#xff0c;技术专家们开始研究比特币的底层技术&#xff0c;并抽象提取出来&#xff0c;形成区块链技术&#xff0c;或者称分布式账本技术。 1.1.2 定义 简称BT&#xff08;Blockchain technology&#xff…

【递归】【后续遍历】【迭代】【队列】Leetcode 101 对称二叉树

【递归】【后续遍历】Leetcode 101 对称二叉树 解法一&#xff1a; 递归&#xff1a;后序遍历 左右中解法二&#xff1a; 迭代法&#xff0c;用了单端队列 ---------------&#x1f388;&#x1f388;对称二叉树 题目链接&#x1f388;&#x1f388;------------------- 解法一…

Eclipse - Code Templates

Eclipse - Code Templates References Window -> Preferences -> C/C -> Code Style -> Code Templates 配置默认代码模板&#xff0c;可以点击 Export 将自己配置好的 Code Templates 导出去&#xff0c;以便备份和共享。 References [1] Yongqiang Cheng, https…

Docker原理及概念相关

Docker最核心的组件 image&#xff1a;镜像&#xff0c;构建容器&#xff0c;也可以通过Dockerfile文本描述镜像的内容。 (我们将应用程序运行所需的环境&#xff0c;打包为镜像文件) Container&#xff1a;容器 (你的应用程序&#xff0c;就跑在容器中 ) 镜像仓库(dockerhub)(…

应急响应实战笔记02日志分析篇(5)

第5篇:MySQL日志分析 常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析&#xff0c;可以发现攻击行为&#xff0c;进一步还原攻击场景及追溯攻击源。 0x01 Mysql日志分析 general query log能记录成功连接和每次执行的查询&#xff0c;我们…

《白话C++》第10章 STL和boost,Page84 shared_ptr示例使用,容器中的指针

容器中的指针在容器解体时经常忘了释放&#xff1f;指针存放在容器中多次&#xff0c;结果被重复释放&#xff1f;这个问题&#xff0c;通过std::shared_ptr都可以完美地解决&#xff1a; #include <iostream> #include <list> #include <vector> #include …

如何使用Net2FTP部署本地Web网站并实现远程文件共享

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

【DBeaver+mysql】如何在DBeaver中创建mysql服务的连接并新建数据库

一、创建步骤 1、下载安装mysql 8.0&#xff08;注意&#xff0c;安装过程会启动mysql服务&#xff0c;这才是能用命令行执行node处理sql语句的关键&#xff09; 下载地址&#xff1a;https://dev.mysql.com/downloads/file/?id526407 2、下载安装DBeaver数据库管理IDE 3、在…

优化线性回归模型的代价函数

目录 前言1 代价函数与线性回归模型2 单变量线性回归3 双变量线性回归4 优化过程结论 前言 线性回归是机器学习领域中最基础的模型之一&#xff0c;它通过找到最佳拟合直线来预测连续型输出变量。在线性回归中&#xff0c;代价函数&#xff08;Cost Function&#xff09;起着至…

查询获取SMBIOS的方法

一、用于在本地查询 SMBIOS 的示例 PowerShell 脚本 Microsoft网站参考 以下 ChassisTypes 列表是从最新的 DMTF SMBIOS 规范复制的。 # Set-ExecutionPolicy or Script Signing documentation needs to be reviewed # Current script is designed to run on individual mach…

x86下使用硬件实现的任务切换(TSS表)---使用代码讲解

实现任务切换(使用TSS) 视频讲解可以看这一个课程 • The current program, task, or procedure executes a JMP or CALL instruction to a TSS descriptor in the GDT. • The current program, task, or procedure executes a JMP or CALL instruction to a task-gate descri…

并查集,真好用,一次AC不是梦!

文章目录 &#x1f680;前言&#x1f680;并查集&#x1f680;并查集的两个优化✈️路径压缩✈️按秩合并 &#x1f680;并查集代码模板 &#x1f680;前言 大家好啊&#xff01;今天阿辉来给大家介绍一种简洁而优雅的数据结构——并查集&#xff0c;不知道各位是否了解它&…

ssh连接服务器需要子网掩码吗?

IP寻址需要同时知道IP地址和子网掩码&#xff0c;但是在通过ssh连接服务器时&#xff0c;只需要知道IP地址和端口号就可以了&#xff0c;ssh通讯为什么不需要子网掩码呢。在不知道子网掩码的前提下&#xff0c;可以正确找到IP对应的主机吗&#xff1f; 不需要&#xff0c;SSH&a…

桌面显示器应用Type-C接口

随着科技的飞速发展&#xff0c;桌面显示器作为我们日常工作中不可或缺的设备之一&#xff0c;也在不断地更新换代。其中&#xff0c;Type-C接口的应用成为了桌面显示器发展的一个重要趋势。那么&#xff0c;桌面显示器应用Type-C接口究竟有什么好处呢&#xff1f; 首先&#x…

职场隐私守则:关系再好也别碰这些“雷区”

在职场中&#xff0c;与同事建立良好的关系是非常重要的&#xff0c;它有助于提高工作效率、增进团队协作&#xff0c;并且能够为日常的工作带来便利。 然而&#xff0c;即便与同事的关系再亲密&#xff0c;也有一些隐私话题是绝对不能轻易透露的。 在与同事和领导相处时&…

文章复现 | 差异分析和PPI网络构建

原文链接&#xff1a;差异分析和PPI网路图绘制教程 写在前面 在原文中&#xff0c;作者获得285个DEG&#xff0c;在此推文中共获得601个DEG。小杜的猜想是标准化的水段不同的原因吧&#xff0c;或是其他的原因。此外&#xff0c;惊奇的发现发表医学类的文章在附件中都不提供相…

燃气热水器水箱的气密性测试密封方案介绍—格雷希尔快速接头

家用燃气热水器的气密性检测是保障其安全性的重要环节之一&#xff0c;如热水器的水箱&#xff0c;它的周围缠绕着一圈铜管&#xff0c;这圈铜管和水箱之间有数量不等的焊接点&#xff0c;为了保证热水器的正常运行&#xff0c;必须要对它们进行气密性测试。   燃气热水器水箱…

文件且目录损坏无法读取怎么办?

文件及目录损坏无法读取是计算机使用过程中的常见故障&#xff0c;这可能是由于多种原因导致的&#xff0c;例如硬件故障、文件系统错误、病毒感染或不当操作等。本文将对这一问题进行深入分析&#xff0c;探讨其根本原因&#xff0c;并提供相应的解决方法&#xff0c;包括数据…

Collectors.toMap使用记录

最近看到一行比较有趣的代码&#xff0c;他的功能就是将List转换为Map。我觉得挺有意思的&#xff0c;先前没遇到过&#xff0c;于是打算写篇文章记录一下。 public enum CodeEnum {USER("user"),AGE("age"),INTEREST("interest"),;private Str…