9、多用户连接架构:Mesh、SFU、MCU 全面对比

聊到多人实时通信,很多朋友第一反应就是「把两个人连起来的方式,扩展到 N 个人不就行了?」。嗯,真没这么简单。我在早期做视频会议项目时,就踩过这个坑——当时天真地用了全连接方案,结果 6 个人开会,客户端直接卡成幻灯片。

今天咱们就把三种主流架构掰开揉碎讲清楚:Mesh(网状)、SFU(选择性转发单元)、MCU(多点控制单元)。每种我都亲手搭过,坑也踩了不少,希望能帮你少走弯路。

9.1 为什么需要多用户架构?

WebRTC 本身是点对点的。两个人通话,直接建一个 PeerConnection 就行。但如果是 5 个人、10 个人呢?

你想想看,每个客户端都要跟其他所有人建立连接。5 个人就需要 10 条连接。10 个人就是 45 条。这个数字增长是 O(n²) 的——说白了,人数翻倍,连接数翻四倍。

更头疼的是上行带宽。每个客户端都要把自己的音视频流发送给其他所有人。如果你的上行只有 5Mbps,分给 9 个人,每人只能分到 500Kbps 左右。画质?别想了。

所以我们需要不同的架构来解决这个扩展性问题。三种主流方案各有取舍,没有银弹。

9.2 Mesh 架构:最简单的方案

Mesh 架构,也叫全连接架构。每个客户端跟其他所有客户端建立直接的 PeerConnection。

举个例子:4 个人开会,每个人需要建立 3 条连接,总共 6 条连接。每条连接都是独立的 P2P 通道。

核心特点:
  • 不需要服务器转发媒体流
  • 每个客户端上行 = 单路码率 × (N-1)
  • 每个客户端下行 = 单路码率 × (N-1)
  • 延迟最低(直连)

我在一个内部工具项目里用过 Mesh。当时团队只有 4 个人,需求就是简单语音通话。Mesh 完美胜任,部署也简单——一个信令服务器就够了,不需要额外的媒体服务器。

但如果你要支持 10 人以上,Mesh 基本就废了。为什么?

  • 上行带宽爆炸:假设每路视频 1Mbps,10 个人,你得上行 9Mbps。普通家庭宽带的上行也就 10-20Mbps,再开个摄像头就满了。
  • CPU 负担重:每个连接都要独立编码、加密。我测试过,6 路视频同时编码,笔记本风扇直接起飞。
  • NAT 穿透困难:连接数越多,打洞失败的概率就越高。总有几个连不上的。
避坑指南:我曾经在一个项目中用 Mesh 支持 8 人视频,结果发现部分用户的 NAT 类型是「对称型」,STUN/TURN 都搞不定。最后不得不临时加了一台 TURN 服务器,成本直接翻倍。所以 Mesh 建议只用于 4-6 人以内的小规模场景。

9.3 SFU 架构:当前最主流的选择

SFU(Selective Forwarding Unit),选择性转发单元。它不混流,只转发。每个客户端只跟 SFU 服务器建立一条连接,把自己的流推上去,然后 SFU 把其他所有人的流转发下来。

说白了,SFU 就是一个「智能路由器」。它知道谁在说话、谁在看谁,可以按需转发。

核心特点:
  • 每个客户端上行 = 单路码率(只推一路给 SFU)
  • 每个客户端下行 = 单路码率 × (N-1)(SFU 转发所有其他人的流)
  • 服务器带宽 = 上行 × N + 下行 × N
  • 支持 Simulcast(同时发送多分辨率流)

我个人习惯用 SFU 做中大型会议。比如 Zoom、Google Meet 底层用的就是 SFU 变种。为什么它这么流行?

  • 上行压力小:你只需要推一路流给服务器,不管多少人开会,上行带宽固定。
  • 灵活性强:SFU 可以决定转发哪些流。比如只转发当前说话人的视频,或者根据用户屏幕大小选择合适的分辨率。
  • 支持 Simulcast:客户端同时发送 3 路不同分辨率的流(比如 720p、360p、180p),SFU 根据接收端需求转发合适的流。这个功能我在项目中用过,效果非常好——手机端收小流,PC 端收大流,带宽利用率极高。

但 SFU 也有缺点:

  • 服务器带宽成本高:N 个人开会,服务器需要处理 N×(N-1) 路的转发。100 人会议,服务器要转发 9900 路流。带宽成本不低。
  • 客户端解码压力大:每个客户端要解码 N-1 路视频。10 个人就是 9 路解码,手机可能扛不住。
  • 延迟比 Mesh 略高:多了一跳(客户端 → SFU → 客户端),但通常可以接受(20-50ms)。
我的经验:SFU 架构下,建议开启 Simulcast 并配合「视频流动态选择」逻辑。比如当用户切换到小窗模式时,自动订阅低分辨率流;全屏时切换到高分辨率流。我在一个在线教育项目中这么做了,服务器带宽节省了约 40%。

9.4 MCU 架构:老牌方案,但正在被淘汰

MCU(Multipoint Control Unit),多点控制单元。它把所有客户端的流收上来,在服务器端混成一路流,再分发给所有人。

你看到的「九宫格」画面,其实就是 MCU 在服务器端拼好的。每个客户端只需要解码一路流。

核心特点:
  • 每个客户端上行 = 单路码率
  • 每个客户端下行 = 单路码率(只收一路混流)
  • 服务器带宽 = 上行 × N + 下行 × N(但流数少)
  • 服务器需要做混流、转码,CPU 消耗极大

MCU 最大的优势是客户端压力最小。不管多少人开会,客户端只需要编解码一路流。这对移动端、低端设备非常友好。

但它的缺点也很致命:

  • 服务器成本极高:混流需要大量的 CPU/GPU 资源。我见过一个支持 50 人的 MCU 服务器,用的是双路 Xeon + 独立显卡,成本轻松上万。
  • 灵活性差:所有客户端看到的是同一个画面。你想单独看某个人?不行。你想调整布局?得服务器端改。
  • 延迟较高:混流需要等待所有流到达,然后重新编码。延迟通常在 100-300ms。
  • 扩展性差:单台 MCU 能支持的人数有限,集群方案又非常复杂。
避坑指南:我曾经在 2018 年用开源的 MCU 方案(比如 Licode)搭过一个视频会议系统。当时觉得 MCU 对客户端友好,结果上线后服务器 CPU 经常飙到 90% 以上。后来换成 SFU,同样的服务器配置,支持人数从 30 人提升到了 200 人。所以除非你的客户端全是低端手机,否则不建议用 MCU。

9.5 三种架构的全面对比

下面这张表是我根据实际项目经验整理的,你可以直接拿去用:

维度 Mesh SFU MCU
客户端上行带宽 单路 × (N-1) 单路 单路
客户端下行带宽 单路 × (N-1) 单路 × (N-1) 单路
服务器带宽 无(仅信令) N × (N-1) 路 N 路上行 + 1 路下行
服务器 CPU 消耗 极低 低(仅转发) 极高(混流转码)
客户端 CPU 消耗 高(N-1 路编解码) 中(N-1 路解码) 低(1 路解码)
延迟 最低 中高
灵活性 高(可单独控制每路) 高(可按需转发) 低(统一画面)
推荐人数 2-6 人 10-500 人 10-50 人
典型场景 小团队语音 视频会议、直播 传统视频会议

9.6 架构选择决策树

如果你现在要做一个多用户通信系统,不知道怎么选,可以参考这个思路:

  1. 人数 ≤ 4:直接用 Mesh。简单、免费、延迟最低。不需要服务器。
  2. 人数 5-10:看客户端设备。如果全是 PC,Mesh 还能扛;如果有手机,建议上 SFU。
  3. 人数 10-100:SFU 是唯一合理的选择。配合 Simulcast 和动态订阅,效果很好。
  4. 人数 > 100:SFU + 分层架构。比如用级联 SFU,或者结合 CDN 做大规模分发。
  5. 客户端全是低端设备:考虑 MCU,但要做好服务器成本预算。
我的建议:除非有特殊需求,否则优先选 SFU。它是最平衡的方案。开源实现有 mediasoup、Janus、LiveKit 等,社区活跃,文档齐全。我最近几个项目都用 mediasoup,稳定性和性能都很满意。

9.7 架构对比图

下面这张 SVG 图展示了三种架构的核心区别,你可以直观地看到数据流向:

三种多用户架构对比 Mesh 架构 A B C D 全连接,无服务器 SFU 架构 SFU 服务器 A B C D 服务器转发,不混流 MCU 架构 MCU 服务器 A B C D 混流 + 转码 服务器混流,客户端收一路 关键指标对比 客户端上行: Mesh = 单路 × (N-1) SFU = 单路 MCU = 单路 客户端下行: Mesh = 单路 × (N-1) SFU = 单路 × (N-1) MCU = 单路 服务器负载: Mesh = 无 SFU = 低(转发) MCU = 高(混流) 推荐人数: Mesh = 2-6 人 SFU = 10-500 人 MCU = 10-50 人

9.8 实际项目中的选择建议

最后,我想分享一些实际项目中的经验:

  • 小团队内部工具:Mesh 就够了。比如 3-5 人的研发团队语音沟通,不需要服务器,部署成本为零。
  • 在线教育:SFU 是首选。老师推一路高清流,学生端按需订阅。配合 Simulcast,手机端收小流,PC 端收大流,体验很好。
  • 大型直播互动:SFU + CDN 混合架构。主播用 SFU 跟嘉宾互动,观众通过 CDN 拉流,这样能支持上万人。
  • 传统视频会议:如果客户要求兼容老旧的 H.323/SIP 设备,MCU 可能是唯一选择。但新项目建议直接上 SFU。
我的经验:如果你刚开始做多用户通信,建议从 SFU 入手。开源方案 mediasoup 的文档非常友好,我花了两天就搭出了一个可用的原型。先跑通,再根据实际压力测试结果决定是否需要优化。

好了,三种架构就讲到这里。记住一句话:没有最好的架构,只有最合适的架构。Mesh 简单但扩展性差,MCU 对客户端友好但服务器成本高,SFU 是当前最平衡的选择。根据你的实际场景和预算来选,别盲目跟风。

公众号:蓝海资料掘金营,微信 deep3321