
前面已经根据WebRTC流分析了Digital Ocean中标准服务器配置的容量,我们注意到一台服务器最多可以覆盖2000个观众。 在现实生活中,一台服务器不足的情况并不少见。
假设德国的赌博业余爱好者正在澳大利亚观看实时赛马。 鉴于赛马不仅是一场体育比赛,而且意味着在适当的时间进行现场下注的情况下获得巨大收益,因此必须以尽可能低的延迟来交付视频。
另一个例子:一家全球性公司是FCMG市场领导者之一,在欧洲,俄罗斯和东南亚设有子公司,该公司正在组织销售经理培训网络研讨会,并通过地中海总部进行实时流媒体直播。 观众必须能够实时查看和收听演示者。
这些示例提出了相同的要求:向大量观众提供低延迟的媒体流。 这将需要部署内容交付网络-CDN。
应该注意的是,使用HLS的传统流传输技术不太适合,因为它可能会增加多达30秒的延迟,这对于实时显示至关重要。 想象一下,马匹已经完成,结果已经发布在网站上,而车迷们仍在观看比赛的结束。 WebRTC技术不受此缺点的影响,可以保证不到1秒的延迟,这得益于现代的通讯渠道,即使在各大洲也可以实现。
首先,我们将看到如何部署最简单的CDN来交付WebRTC流,以及随后如何扩展它。
CDN原则
CDN中的服务器可以扮演以下角色之一:
- Origin是为发布媒体流而构建的服务器。 它共享流到其他服务器以及用户。
- 代码转换器是专用于代码流转换的服务器。 它从Origin服务器提取流,并将经过代码转换的流传递给Edge。 在下面的部分中,我们将研究这个角色。
- Edge是设计用于向用户共享流的服务器。 它从Origin或Transcoder服务器提取流,并且不将其传递到其他CDN服务器。
原始服务器允许发布WebRTC和RTMP流,或通过RTMP,RTSP或其他可用方法捕获其他来源的流。
用户可以通过WebRTC,RTMP,RTSP,HLS播放来自边缘服务器的流。
为了最小化等待时间,期望使用WebRTC在CDN服务器之间传输流。
静态CDN在配置阶段进行了完整描述。 实际上,静态CDN的设置类似于负载平衡器的设置:所有接收方都列在流源服务器的设置中。
例如,我们在法兰克福有一台Origin服务器,在纽约有一台Edge,在新加坡有一台

在这种情况下,将按以下方式设置Origin:
<loadbalancer mode="roundrobin" stream_distribution="webrtc"> <node id="1"> <ip>edge1.thestaticcdn.com</ip> <wss>443</wss> </node> <node id="2"> <ip>edge2.thestaticcdn.com</ip> <wss>443</wss> </node> </loadbalancer>
静态CDN的第一个问题是这样的:为了在这种CDN中包括新的Edge服务器或从CDN中排除服务器,需要修改设置并重新启动所有Origin服务器。
在Origin上发布的流将广播到设置中列出的所有Edge服务器。 用户将连接到哪个边缘服务器的决定也由原始服务器决定。 接下来是第二个问题:如果观众很少或没有观众(例如,在新加坡,这是傍晚,而在纽约,这是深夜),则无论如何,流都将广播到Edge 1。 交通浪费是没有目的的,它不是免费的。
使用动态CDN可以解决这两个问题。
现在,我们希望在不重新启动所有原始服务器的情况下设置CDN,并且不想在没有用户连接的情况下将流传输到边缘服务器。 在这种情况下,无需将CDN服务器的整个列表保留在设置中。 每个服务器必须独立创建这样的列表。 为此,它必须在任何特定时间知道其他服务器的当前状态。
理想情况下,在设置中指定入口点(启动CDN的服务器)就足够了。 在启动期间,每个服务器必须向该入口点发送请求,并作为响应获得CDN节点和已发布流的列表。 如果无法访问入口点,则服务器必须等待来自其他服务器的消息。
服务器必须将其状态的任何更改传达给CDN中的其他服务器。
最简单的CDN:在欧洲中心
现在,我们将尝试设置并启动动态CDN。 首先假设我们需要向欧洲的观众提供多达5000个用户的媒体流。 假设流源也位于欧洲

我们将在欧洲的数据中心中部署三台服务器。 我们将使用Flashphoner WebCallServer(WebRTC流视频服务器)实例作为CDN组件

设置:
cdn_enabled=true cdn_ip=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=origin
cdn_enabled=true cdn_ip=e-eu1.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=edge
cdn_enabled=true cdn_ip=e-eu2.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=edge
动态CDN节点之间的消息交换是通过Websocket实现的,当然也支持Secure Websocket。
CDN内部的流通过WebRTC广播。 通常将UDP用作传输,但是如果必须确保服务器之间的通道不太好而又要确保良好的流传输质量,则可以切换到TCP。 不幸的是,在这种情况下,等待时间增加了。
重新启动服务器,在o-eu1
服务器上打开“双向流”示例,将周期性10分钟发布为0倒数计时器视频

在e-eu1
服务器上打开Player示例,播放流

并在e-eu2
上做同样的事情

CDN正在运行! 正如您在屏幕截图中所看到的,由于WebRTC和良好的频道,在发布部分和观看部分中,视频的时间与第二时间重合。
超越我们:连接美国
现在,我们要牢记发布的同时,向美洲大陆的观众提供视频流

我们将在美国数据中心部署三台服务器,而不会关闭CDN的欧洲部分

设置:
cdn_enabled=true cdn_ip=o-us1.flashponer.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=origin
cdn_enabled=true cdn_ip=e-us1.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=edge
cdn_enabled=true cdn_ip=e-us2.flashphoner.com cdn_point_of_entry=o-eu1.flashponer.com cdn_nodes_resolve_ip=false cdn_role=edge
重新启动美国服务器,检查发布

和播放

请注意,欧洲部分继续运作。 我们将检查美国用户是否能够看到来自欧洲的信息流。 在o-eu1
服务器上发布test_eu
流

并在e-us1

而且这也有效! 至于等待时间,屏幕截图再次显示了计时器在发布部分和观看部分中的视频与第二部分之间的同步。
请注意,默认情况下不可能在原始服务器上播放在另一台原始服务器上发布的流,但是如果有必要,可以相应地进行设置。
cdn_origin_to_origin_route_propagation=true
待续
总而言之,我们已经部署了一个简单的CDN,然后将其成功扩展到两大洲,以发布和播放低延迟的WebRTC流。 为此,我们没有在回放时修改流参数,而在现实生活中经常需要这样做:所有观众都拥有不同的频道,并且为了保持流质量,例如,需要降低分辨率或比特率。 我们将在以下部分中对此进行处理...
DigitalOcean Marketplace中的Flashphoner WebCallServer图像-DigitalOcean中的Web Call Server图像。
CDN用于低延迟WebRTC流 -基于Web呼叫服务器的内容传递网络。