Discord如何使用WebRTC为两百五十万同时在线用户提供语音服务(三)

管理语音服务器 

每个语音服务器都会定期报告其运行和负载情况。并且我们在上一篇博客文章中讨论过,这些信息将在整理后放入我们的服务发现系统(即etcd)中。

Discord Guilds服务器会通过监视服务发现系统,把给定区域中使用次数最少的语音服务器分配给公会。选定Discord Voice服务器后,所有正在语音的用户(也由Discord Guilds维护)都会被推送到语音服务器,之后服务器就有权设置音频/视频转发了。客户端会接到有关选定的Discord Voice服务器的信息。客户端可以打开第二个与语音服务器相连的WebSocket(我们称为语音WebSocket连接),该连接用于设置媒体转发和语音指示。

当客户端显示“等待端点响应”时,表示Discord Guilds服务器正在寻找最匹配的Discord Voice服务器。当客户端显示“已连接语音”时,表示客户端已成功与选定的Discord Voice服务器交换了UDP消息。

Discord Voice服务器包含两个组件:信令组件和称为“选择性转发单元(SFU)”的媒体中继组件。信令组件完全控制SFU,负责生成流标识符和密钥、转发语音指示等。

我们自主开发的SFU(用C ++编写)负责在通道内转发音频和视频流量。我们的SFU是针对用例量身定制的,可提供最佳性能,因此成本也是最低的。在我们审核有问题的用户(即其服务器静音)时,其音频数据包将被丢弃。SFU还负责连接本机和浏览器应用程序,实现两者间的传输和加密,并在转发媒体数据包时在两者之间进行转换。SFU还负责处理实时控制传输协议(RTCP),该协议用于视频质量优化。SFU要收集并处理来自接收方的RTCP报告,并通知发送方有多少带宽可用于视频。 

故障转移

因为故障转移是唯一可从公共因特网直接访问的服务,所以我们将重点介绍Discord Voice服务器的故障转移功能。

信令组件一直在监视SFU。如果SFU崩溃了也会被立即重启,从而将服务中断的损失(即丢失很少数量的数据包)降至最低。SFU状态由信令组件重建,无需任何客户端交互。尽管SFU崩溃很少见,但以防万一我们为零停机SFU更新也应用了故障转移机制。

当Discord Voice服务器宕机时,它无法周期性进行Ping,也无法从服务发现系统中删除。客户端也会发现服务器故障了,因为语音WebSocket连接已断开,需要通过网关WebSocket连接请求语音服务器ping。Discord Guilds服务器会确认故障、查询服务发现系统,之后将新的Discord Voice服务器分配给该公会。然后Discord Guilds将所有正在语音的对象推送到新的语音服务器。每个客户端都会收到有关新语音服务器的通知,并会创建一个新语音服务器的语音WebSocket连接,以启动媒体设置。

原文地址:https://blog.discordapp.com/how-discord-handles-two-and-half-million-concurrent-voice-users-using-webrtc-ce01c3187429

文章作者:Jozsef Vass

填写常用邮箱,接收社区更新

WebRTC 中文社区由

运营