SFU 확장 구조 — 단일 노드 용량과 Cascading
Full Mesh, 단일 SFU, 지역 간 SFU cascading, CDN 기반 방송 구조의 부하 특성을 비교합니다. SFU 용량은 참가자 수만으로 정해지지 않고 publish·subscribe 수, simulcast layer, bitrate, packet rate, 암호화, 하드웨어에 따라 달라집니다. 따라서 예시 계산은 용량 계획의 출발점으로만 사용하고 실제 트래픽 모델로 부하 시험해야 합니다.
목차(27개 항목)
- 0. 핵심 명제 — "실시간 양방향"과 "대규모 단방향"은 다른 문제다
1. 출발점 — P2P(Mesh)는 왜 몇 명에서 무너지나
2. SFU — "복제 분배"를 서버에 떠넘긴다
3. SFU vs MCU — 저지연의 근거는 "포워딩만 한다"
4. 코덱 협상 — SFU가 포워딩만 하려면 양끝 코덱이 맞아야 한다
5. 단일 SFU 노드의 한계 — 아웃바운드 산수
6. Cascading — SFU를 묶어 수만 명으로
7. 단방향 대규모 배포라면 HLS/CDN도 검토한다
8. 규모·지연으로 보는 토폴로지 의사결정
- 9. 한 장 요약 — 암기 카드
- 10. 한 줄 결론
- 관련 글
- 참고 자료
"화상회의는 100명까지 되던데, 라이브 방송은 어떻게 10만 명이 보나요? 같은 WebRTC 아닌가요?". RTC 아키텍처를 검토하는 자리에서 자주 나오는 질문입니다. 답부터 말하면 — 둘은 같은 WebRTC라도 토폴로지가 다르고, 100명과 10만 명은 애초에 다른 메커니즘으로 푼다는 것입니다.
이 글은 그 경계를 처음부터 끝까지 정리합니다. P2P 풀메시가 왜 몇 명에서 무너지는지, SFU가 왜 저지연인지, 단일 SFU 노드가 몇 명에서 한계에 닿는지, 그리고 그 한계를 넘는 Cascading과 — 더 큰 규모에서는 아예 라이브 스트리밍(HLS/CDN)으로 갈아타는 분기점까지.
0. 핵심 명제 — "실시간 양방향"과 "대규모 단방향"은 다른 문제다
컨퍼런스와 방송은 발행자 수·구독 관계·상호작용 요구가 다르다. SFU는 보통 미디어 payload를 트랜스코딩하지 않고 선택적으로 전달하지만 transport를 종단하고 RTP header를 재작성할 수 있다. 단일 노드 용량과 end-to-end latency는 워크로드·구현·하드웨어로 측정해야 한다.
흔한 오해와 정정:
| 오해 | 정확한 이해 |
|---|---|
| SFU도 영상을 합쳐서(합성) 보낸다 | 합성은 MCU의 전형적 역할입니다. SFU는 보통 RTP 패킷을 선택해 포워딩합니다. |
| SFU 한 대로 수십만 명도 된다 | 단일 노드 용량은 발행 트랙·구독 수·비트레이트·PPS·암호화·하드웨어로 부하 테스트 |
| 단일 SFU 한계는 순전히 대역폭 때문이다 | CPU·메모리·I/O·패킷률·암호화·재전송도 함께 작용합니다. |
| 대규모 라이브도 항상 WebRTC SFU로 푼다 | 단방향 대규모 배포는 HLS/CDN도 후보입니다. 상호작용과 지연 요구로 선택합니다. |
| Cascading 추가 지연은 항상 수십 ms다 | 지역·경로·relay 수에 따라 달라지므로 측정 필요 |
1. 출발점 — P2P(Mesh)는 왜 몇 명에서 무너지나
가장 단순한 구조는 서버 없이 참가자끼리 직접 연결하는 P2P 풀메시(Full Mesh) 입니다. 2명이라면 완벽합니다. 문제는 인원이 늘 때입니다.
여기서 핵심은 각자가 자기 영상을 (N-1)번 복제해서 올린다는 점입니다. 서버가 없으니 분배를 대신해 줄 주체가 없습니다.
인원별 업로드 부하 산수
가정: 한 스트림당 720p ≈ 1.5 Mbps 업링크.
| 인원 N | 각자 업로드 스트림 | 각자 업로드 대역폭 | 가정용 업링크(보통 5~20Mbps) |
|---|---|---|---|
| 2명 | 1개 | 1.5 Mbps | 🟢 여유 |
| 4명 | 3개 | 4.5 Mbps | 🟢 가능 |
| 6명 | 5개 | 7.5 Mbps | ⚠️ 빠듯 |
| 10명 | 9개 | 13.5 Mbps | 🔴 일반 가정 업링크 초과 |
| 20명 | 19개 | 28.5 Mbps | 🔴 불가 |
다운로드도 동일하게 (N-1)개가 들어오지만, 가정용 회선은 보통 다운로드가 업로드보다 훨씬 큽니다. 그래서 풀메시의 진짜 병목은 업링크입니다. 각 클라이언트의 CPU도 (N-1)개를 동시에 인코딩(또는 시뮬캐스트)하느라 같이 무너집니다.
풀메시의 실용 범위는 비트레이트, 참가자 수, 기기와 네트워크에 따라 달라집니다. 고정된 참가자 수 기준 대신 목표 기기와 회선으로 테스트합니다.
P2P가 NAT/방화벽 때문에 연결 자체가 안 되는 문제는 별개 주제입니다 (#8 참고). 여기서는 "연결이 되더라도 부하 때문에 안 된다"는 이야기입니다.
2. SFU — "복제 분배"를 서버에 떠넘긴다
SFU(Selective Forwarding Unit) 는 중앙에 서버를 한 대 두고, 각 참가자가 자기 영상을 서버에만 한 번 올리면, 서버가 그걸 다른 참가자들에게 복제·분배하는 구조입니다.
클라이언트 부하 비교 — 업로드가 1개로 고정된다
| 항목 | 풀메시 | SFU |
|---|---|---|
| 각자 업로드 | (N-1)개 | 1개 (고정) |
| 각자 다운로드 | (N-1)개 | (N-1)개 |
| 각자 인코딩 CPU | 한 인코딩을 재사용할 수 있으나 연결별 처리는 증가 | 발행 인코딩 수는 simulcast/SVC 구성에 따름 |
| 부하가 몰리는 곳 | 클라이언트 | 서버 |
핵심은 부하의 이동입니다. SFU에서는 발행 업로드가 구독자 수에 직접 비례하지 않습니다. 다만 simulcast/SVC 레이어, 수신 구독 수와 signaling 상태는 회의 규모에 따라 달라집니다.
정정 (다운로드는 여전히 N에 비례): SFU가 풀메시 문제를 다 해결하진 않습니다. 각 참가자가 받는 다운스트림은 여전히 (N-1)개입니다. 100명이면 99개 스트림을 받아야 하므로, 실무에서는 화면에 보이는 일부만 큰 해상도로 받고 나머지는 작은 해상도(시뮬캐스트/SVC)로 받거나 끄는 식으로 다운링크를 관리합니다.
3. SFU vs MCU — 저지연의 근거는 "포워딩만 한다"
SFU는 보통 media payload를 디코딩·재인코딩하지 않고 선택적으로 전달합니다. 각 hop의 transport와 보안을 종단하고 SSRC·sequence number 같은 RTP header를 재작성할 수 있으므로 패킷 전체가 그대로인 것은 아닙니다. 반면 MCU는 여러 스트림을 디코딩·합성·재인코딩할 수 있습니다.
비교 매트릭스
| 항목 | P2P(Mesh) | SFU | MCU |
|---|---|---|---|
| 서버 역할 | 없음 | 패킷 포워딩 | 디코딩+합성+재인코딩 |
| 서버 CPU | — | 낮음 (패킷레이트 비례) | 높음 (트랜스코딩) |
| 지연 | 네트워크 경로에 따름 | 추가 media hop 포함, 측정 필요 | 트랜스코딩 처리 추가 |
| 화질 | 원본 | 원본 (포워딩) | 세대 손실 |
| 수신측 부담 | (N-1)개 | (N-1)개 | 1개 |
| 확장성 | 업링크·구독량으로 제한 | 단일 노드·클러스터 부하 테스트 | 믹싱·인코딩 자원으로 제한 |
| 대표 용도 | 1:1 통화 | 컨퍼런스/소셜 | 저사양 단말·믹스 녹화·전화 게이트웨이 |
비유하면, SFU는 우편물을 뜯어보지 않고 그대로 라벨만 보고 분류·전달하는 우체국이고, MCU는 여러 편지를 다 읽고 한 장에 요약해서 다시 쓰는 비서입니다. 우체국은 빠르고 싸지만 받는 사람이 여러 통을 받고, 비서는 한 통으로 정리해주지만 느리고 비쌉니다. 기술적 실체로 환원하면 — SFU는 RTP 페이로드를 건드리지 않아 디코더/인코더를 거치지 않으니 지연과 CPU가 작고, MCU는 디코드→믹스→인코드 파이프라인을 타므로 그 반대입니다.
4. 코덱 협상 — SFU가 포워딩만 하려면 양끝 코덱이 맞아야 한다
SFU가 "디코딩 없이 포워딩만" 하려면 전제가 있습니다 — 송신자가 인코딩한 코덱을 수신자가 디코딩할 수 있어야 합니다. SFU는 트랜스코딩을 안 하므로 코덱을 바꿔주지 못합니다. 이 합의가 SDP(Session Description Protocol) 협상입니다.
핵심 제약
| 상황 | SFU 동작 |
|---|---|
| 송신 VP8, 수신 VP8 지원 | 🟢 그대로 포워딩 |
| 송신 H.264, 수신 H.264 지원 | 🟢 그대로 포워딩 |
| 송신 AV1, 수신 AV1 미지원 | 🔴 포워딩 불가 — 트랜스코딩 필요(=MCU/게이트웨이 영역) |
SFU는 publisher와 각 subscriber의 capability를 바탕으로 전달 가능한 트랙을 선택합니다. Simulcast는 일반적으로 같은 코덱의 여러 spatial/quality encoding을 보내는 기술이지 여러 코덱 동시 송출의 동의어가 아닙니다. 코덱 교집합이 없으면 별도 publisher encoding 또는 transcoder가 필요합니다.
5. 단일 SFU 노드의 한계 — 아웃바운드 산수
SFU 한 대가 감당할 수 있는 인원에는 명확한 천장이 있습니다. 그 천장의 1차 요인이 아웃바운드 대역폭입니다.
컨퍼런스(모두가 모두를 봄): 아웃바운드 = N × (N-1)
모든 참가자가 서로를 보는 회의라면, 서버가 내보내는 총 스트림 수는 N × (N-1)로 제곱에 가깝게 증가합니다.
| 인원 N | 아웃바운드 스트림 수 | 서버 아웃바운드 대역폭 |
|---|---|---|
| 10명 | 90 | 135 Mbps |
| 50명 | 2,450 | 3.7 Gbps |
| 100명 | 9,900 | 14.9 Gbps |
| 200명 | 39,800 | 59.7 Gbps |
100명이 전원 카메라를 켜고 서로를 보는 시나리오는 단일 노드 기준 이미 15 Gbps에 육박합니다. 그래서 실무 컨퍼런스는 "전원이 전원을 풀해상도로 본다"를 절대 허용하지 않고, 활성 발화자 몇 명만 큰 해상도 + 나머지는 썸네일/오디오만으로 다운링크를 줄입니다.
방송형(1명 → N명): 아웃바운드 = N
반대로 1명이 송출하고 N명이 보는 구조라면 아웃바운드는 N에 선형 비례합니다.
| 시청자 N | 아웃바운드 스트림 | 서버 아웃바운드 대역폭 |
|---|---|---|
| 100명 | 100 | 150 Mbps |
| 1,000명 | 1,000 | 1.5 Gbps |
| 5,000명 | 5,000 | 7.5 Gbps |
(이 표는 1.5 Mbps 단일 송출 예시의 선형 산수입니다. 어느 시점에 단일 노드에서 클러스터로 전환할지는 하드웨어와 워크로드 부하 테스트로 정합니다.)
단일 노드의 현실적 천장
단일 SFU 용량은 참가자 수만으로 정해지지 않습니다. 발행 트랙 수, 구독 수, 비트레이트, 패킷률, transport encryption, retransmission, 운영체제와 하드웨어가 함께 결정합니다. 출처와 조건이 없는 범용 용량 수치를 쓰지 않고 구축 대상 워크로드로 부하 테스트합니다.
| 병목 | 무엇이 한계를 만드나 |
|---|---|
| 🔴 아웃바운드 대역폭 | N×(N-1) 또는 N에 비례하는 송출량 |
| 🔴 CPU | 패킷 포워딩·SRTP 재암호화·혼잡제어 연산 (패킷 레이트에 비례) |
| 🔴 메모리 | 연결당 버퍼·지터버퍼·상태 |
| 🔴 네트워크 I/O | 초당 패킷 수(PPS) 처리, 커널/NIC 한계 |
이 천장에 닿으면 선택지는 두 가지입니다 — (1) 더 큰 서버로 수직 확장(한계 명확), (2) 여러 SFU를 묶는 Cascading으로 수평 확장.
6. Cascading — SFU를 묶어 수만 명으로
Cascading(캐스케이딩) 은 지역별로 여러 SFU를 배치하고, 서버 간 고대역폭·저지연 링크로 필요한 트래픽만 릴레이해 단일 노드 한계를 넘는 표준 아키텍처입니다.
Cascading의 핵심 이득
즉 Cascading은 같은 스트림을 장거리 구간에서 반복 전송하는 양을 줄일 수 있습니다. 참가자가 어느 엣지에 붙는지, 실제 확장 규모와 지연은 라우팅 정책과 구독 그래프, 배포 용량에 따라 달라집니다.
추가 지연은 얼마나?
서버 간 relay hop은 전파·큐잉·처리 지연을 추가합니다. 전용 링크 사용 여부와 추가 지연은 배포 환경마다 다르므로 수십 ms로 고정하지 않고 실제 지역 조합에서 측정합니다.
| 구조 | 경로 | 추가 지연 |
|---|---|---|
| 단일 SFU | 참가자 → SFU → 참가자 | 기준 |
| Cascading | 참가자 → 엣지SFU → relay → 엣지SFU → 참가자 | 경로별 측정 |
Cascading의 도전 과제
| 과제 | 내용 |
|---|---|
| 글로벌 상태 관리 | 누가 어느 SFU에 있는지, 어떤 스트림을 어디로 릴레이할지 일관 관리 |
| 지능형 라우팅 | 어느 엣지에 붙일지, 어느 경로로 릴레이할지 실시간 결정 |
| 암호화 스트림 관리 | SFU 간 릴레이 시 보안 세션·키 관리 복잡도 |
| 중복 제거 | 동일 영상을 같은 구간에 두 번 보내지 않도록 트래픽 최적화 |
Agora의 SD-RTN을 특정 cascading SFU 구현으로 단정할 공개 근거는 없습니다. 공식 페이지가 공개한 네트워크·라우팅 설명 범위에서 평가합니다 (#43 참고).
7. 단방향 대규모 배포라면 HLS/CDN도 검토한다
Cascading은 SFU를 여러 지역과 노드로 확장하는 한 방법입니다. 단방향 라이브에서 연결별 상호작용이 필요하지 않다면 HLS/CDN의 캐시 모델도 함께 비교합니다.
구조의 근본 차이
HLS 라이브의 동작 (RFC 8216)
HLS 지연은 segment/part 생성, playlist 갱신, CDN, player start position과 buffer 정책의 합입니다. RFC 8216의
3 × target duration규칙은 live playlist 시작 위치에 대한 안전 조건이지 플레이어가 항상 세 세그먼트를 전부 다운로드해야 한다는 뜻이 아닙니다. 고정 지연값 대신 사용하는 서비스·플레이어의 latency mode를 측정합니다.
라이브 트랜스코딩 vs VOD 트랜스코딩 (AWS 예)
대규모 라이브에서는 보통 여러 화질(ABR)을 동시에 만들어 CDN으로 내보냅니다. 이때 쓰는 서비스가 "라이브용"인지 "파일용"인지 구분이 필요합니다.
| 서비스 | 입력 | 처리 방식 | 용도 |
|---|---|---|---|
| AWS Elemental MediaLive | 라이브 입력(카메라·라이브 이벤트) | 실시간 라이브 인코딩/스트리밍 | 🟢 생방송(스포츠·웨비나), 저지연 라이브 |
| AWS Elemental MediaConvert | S3의 비디오 파일 | 배치(오프라인) 트랜스코딩 | 🟢 VOD(온디맨드·콘텐츠 준비) |
정정 (ABR "단일 인코더 동시 인코딩"은 구현 의존): "하나의 인코더 인스턴스가 1080p/720p/480p를 동시 병렬 인코딩한다"는 표현은 부분적으로만 맞습니다. 정확히는 단일 소스로부터 여러 해상도 렌디션을 병렬로 생성하는 것을 지원하는 것이며, 실제로 단일 인스턴스가 모든 렌디션을 동시에 처리하는지는 구현·벤더·리소스에 따라 다릅니다. 일반적으로 각 해상도는 분리된 트랜스코딩 작업으로 처리되고, VOD는 배치, 라이브는 병렬 처리가 가능하되 아키텍처 세부는 벤더별로 상이합니다. ABR 래더·키프레임 동기화 산수는 #38을 참고하세요.
8. 규모·지연으로 보는 토폴로지 의사결정
규모대별 요약 카드
| 규모 | 토폴로지 | 지연(대략) | 부하 특성 |
|---|---|---|---|
| 2명 | P2P 직결 | 가장 낮음 | 클라이언트 |
| 소수 참가자 | P2P 풀메시 후보 | 경로별 측정 | 클라이언트 업링크, 각자 (N-1)개·총 연결 N×(N-1)/2 |
| 중간 규모 | SFU 단일 노드 또는 클러스터 | 워크로드 측정 | 구독 graph에 따른 서버 아웃바운드 |
| 다중 지역·대규모 | 분산 SFU/relay | 지역별 측정 | 서버 클러스터 + relay |
| 단방향 대규모 | HLS/CDN | 서비스 모드로 측정 | CDN 캐시 활용 |
트레이드오프: WebRTC는 연결별 상태와 낮은 지연·상호작용을, HLS/CDN은 캐시 가능한 배포를 중심으로 설계합니다. 낮은 지연과 큰 규모를 함께 요구할수록 용량 계획과 운영 복잡도가 커집니다.
9. 한 장 요약 — 암기 카드
| 개념 | 한 줄 요약 |
|---|---|
| P2P 풀메시 | 서버 없이 직결. 각자 업로드 (N-1)개라 참가자 증가에 따라 빠르게 부담 증가 |
| SFU | 서버가 복제 분배. 업로드 1개로 고정, 디코딩 없이 포워딩 → 저지연 |
| MCU | 디코딩·합성·재인코딩 → 수신 1개지만 CPU·지연·세대손실 |
| SFU 저지연 근거 | 패킷만 포워딩(재암호화만), CPU ∝ 패킷레이트 |
| 단일 SFU 한계 | 발행·구독·비트레이트·PPS·CPU·메모리·I/O로 부하 테스트 |
| 컨퍼런스 아웃바운드 | N×(N-1) (제곱에 가깝게 폭증) |
| 방송형 아웃바운드 | N (선형) |
| Cascading | 지역 엣지 SFU + 서버 간 릴레이, 규모·지연은 부하 테스트 |
| HLS/CDN | 캐시 가능한 미디어 배포, 지연은 서비스 설정으로 측정 |
| MediaLive vs MediaConvert | 라이브(실시간) vs 파일(VOD 배치) |
10. 한 줄 결론
토폴로지는 참가자 수 하나가 아니라 발행자 수, subscription graph, 목표 지연, 상호작용, 기기와 네트워크로 결정한다. SFU 용량과 cascading 추가 지연은 구축 대상 워크로드로 검증하고, 대규모 단방향 시청은 HLS/CDN의 캐시 확장성을 함께 비교한다.
관련 글
- #43 Agora 자체 코덱 vs Web SDK, SD-RTN, FEC — Agora가 공개한 SD-RTN 제품 범위
- #40 라이브 스트리밍 프로토콜 선택 — HLS / LL-HLS / WebRTC — 수십만 시청자에서 HLS/CDN으로 넘어가는 분기점
- #8 왜 P2P가 막히는가? — NAT, STUN, TURN — P2P가 연결 자체에서 막히는 별개 문제
- #28 H.264 Profile·인코더 옵션·비트레이트의 현실 — SFU 포워딩의 전제인 코덱 협상 깊게 보기
- #38 ABR Ladder와 키프레임 동기화 — HLS/CDN의 다해상도 렌디션 산수
참고 자료
- RFC 8216 — HTTP Live Streaming (HLS) — m3u8 플레이리스트·EXT-X-MEDIA-SEQUENCE·#EXTINF 표준
- RFC 7667 — RTP Topologies — SFU를 포함한 RTP middlebox topology
- LiveKit SFU internals — SFU 구현 내부
- AWS Elemental MediaLive features — 라이브 인코딩 서비스
- AWS Elemental MediaConvert — 파일 기반 VOD 트랜스코딩
- Enabling Low-Latency HLS (Apple) — LL-HLS 저지연