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…

MACOS上面C/C++获取网卡索引,索引获取网卡接口名

依赖函数&#xff1a; if_nametoindex IF名字 to IF索引 if_indextoname IF索引 to IF名字 MACOS 10.7 版本支援&#xff08;就是2011年发不OSX的第一个面向用的系统版本&#xff09; int GetInterfaceIndex(const ppp::string& ifrName) noexcept{if (ifrName.empt…

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;我们…

【题解】洛谷 P4423 [BJWC2011] 最小三角形

题目链接 传送门 思路 我们充分发扬人类智慧&#xff1a; 将所有点全部绕原点随机旋转同一个角度&#xff0c;然后按 x y x\times y xy 从小到大排序。 根据数学直觉&#xff0c;在随机旋转后&#xff0c;答案中的三个点在数组中肯定不会离得太远。 所以我们只取每个点…

vue 生成word表格文档 前端库介绍

在Vue中生成Word表格文档&#xff0c;你可以使用一些前端库来帮助你完成这项任务。以下是几个流行的库及其简要介绍&#xff1a; 1. **docxtemplater**: - **介绍**: docxtemplater是一个基于JavaScript的库&#xff0c;它可以处理docx和pptx模板&#xff0c;允许你通过JSON…

《白话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;起着至…

js-前端存储之sessionStorage

1.使用场景 sessionStorage 是 Web Storage API 提供的一种客户端存储机制&#xff0c;用于在浏览器中保存会话级别&#xff08;session-level&#xff09;的数据。与 localStorage 不同&#xff0c;sessionStorage 中存储的数据在用户关闭标签页或浏览器窗口时会被清除。 2.使…

uniapp小程序因使用 uni.switchTab传不了值使用vuex(简单明了)

uniapp里面不需要npm下载vuex&#xff0c;自带vuex直接用就行 一、先建立一个index.js文件夹 里面写如以下代码 import Vue from vueimport Vuex from vuexVue.use(Vuex)const store new Vuex.Store({state: {userExt: null},mutations: {//相当于同步的操作setUserExt(sta…

查询获取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…

Spring Event详解

Spring Event详解 1.详细介绍2.使用场景3.注意事项4.案例分析5.代码实现6.与消息队列的区别7.SpringEvent结合线程池异步实现 1.详细介绍 Spring Event是Spring框架内建的一种发布/订阅&#xff08;Publish-Subscribe&#xff09;模式的实现&#xff0c;它允许应用内部不同组件…

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

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

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

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