网易连麦不卡、万人互动不断:实时互动系统架构大揭秘(含并发实测与容灾策略)

209 阅读3分钟

网易云音乐、网易游戏、网易CC、网易云信等产品中,连麦、语聊、互动 PK、观众上麦等场景早已日常化。

能支撑“万人同时连麦互动不卡顿”,靠的不是运气,是架构。

本篇带你从底层网络协议、房间服务架构、容灾策略、媒体通道调度全盘透视网易连麦系统。


一、连麦互动系统总览图(生产环境架构)

graph TD
A[客户端 A] --> B1[SFU 服务]
C[客户端 B] --> B1
B1 --> D[MediaRelay 节点]
D --> E[云端编解码 & 转发中枢]
E --> F[内容安全/转录/情绪识别]
B1 --> G[控制信令服务(WebSocket)]

image.png

二、网易为什么不全用 WebRTC?

因为WebRTC虽然实时性强,但它不适合复杂业务场景(比如主播 + 嘉宾 + 千人观众 + 弹幕互动 + 礼物同步等)。

网易的优化方式:

模块替代/增强策略
WebRTC自研 SFU(Selective Forwarding Unit)集群
UDP 通道使用 QUIC over UDP + FEC
房间服务独立“RoomServer”进行连接状态管理
控制通道单独信令服务,支持断点恢复 & 快速握手

三、核心组件1:SFU 转发服务器(Selective Forwarding Unit)

SFU 的职责是:

  • 接收来自客户端的音视频流(仅一次上传)
  • 根据业务策略(谁说话、谁连麦)将音视频流有选择地转发给其他人
// 伪代码:接收音频帧并分发
function onReceiveAudio(uid, frame) {
  const receivers = getRoomReceivers(uid)
  receivers.forEach(targetUid => {
    forwardFrameToClient(targetUid, frame)
  })
}

✅ 特点:

  • 低带宽消耗
  • 服务端无重编码(快)
  • 允许动态调整发流策略(主播可控)

四、核心组件2:RoomServer 房间状态服务(保证互动“稳定”)

RoomServer 维护:

  • 所有房间的连接状态
  • 当前上麦/下麦用户
  • 静音/音量/礼物/互动状态
  • 用户重连恢复
// 示例:状态广播
roomState['room_112'] = {
  users: ['u1', 'u2', 'u3'],
  status: { 'u1': 'talking', 'u2': 'muted' }
}

当用户掉线再上线时,RoomServer 会自动恢复其状态,并指令 SFU 重建流通道。


五、实测数据(网易真实压力测试)

场景用户数量延迟丢包恢复音画同步
主播 + 8人连麦 + 3000人观众低于 500ms
主播 + 20人上麦(语聊房)低于 700ms
主播 + 嘉宾 + 实时抽奖+送礼600ms

网易采用边界控制策略

  • 超过并发数后,自动切入“旁路转推模式”(类似“听直播录播”)
  • 高优先级用户(VIP)继续享受实时音视频

六、容灾设计:连麦系统怎么扛“单点故障”?

网易 SFU 集群部署于多 Region,配合调度层容灾:

// SFU服务自动健康检查
setInterval(() => {
  const sfuList = getAvailableSFUs()
  sfuList.forEach(sfu => {
    if (!ping(sfu)) {
      markUnhealthy(sfu)
      migrateStreams(sfu)
    }
  })
}, 5000)
  • 健康检查失败 → 自动流迁移
  • 所有客户端有「备用信令」通道(快速重连,1秒内恢复)
  • 异地多活部署,CDN 支撑内容转推

七、网易的“互动体验优化”细节

细节实现
礼物特效同步时间戳同步 + 服务端裁决
弹幕不卡顿单独的弹幕频道 + WS推送聚合
多人上麦抢说话不抢流SFU 内部有“发言者检测”算法
自动静音/断流异常检测触发(如网络异常、麦克风坏)

八、总结:网易能做到千人连麦不卡,靠的是:

  • 多级架构拆分(SFU / Room / 信令 / 安全)
  • 异地多活 + 流量调度容灾
  • 自研协议栈(QUIC + FEC)
  • 专业调优:边发边转边识别,毫秒级同步

彩蛋:

“不是所有连麦,都是‘实时互动’,网易做的是真正的互动体验。”