0

Tôi tự code phần mềm video call 3 người thì mượt mà 6 người thì lag (nhầm 2 người thì mượt)

WebRTC tutorial đã nói dối bạn. Video call không khó. Scale video call mới khó.


1. Mọi chuyện bắt đầu bằng một tutorial “Build Zoom clone in 30 mins”

Nếu bạn từng học WebRTC…

thì khả năng cao bạn cũng từng xem một tutorial kiểu:

“Build Google Meet clone in 20 minutes!!! 🔥”

Và đúng là lúc demo…

mọi thứ nhìn rất magical.

Chỉ vài dòng code:

navigator.mediaDevices.getUserMedia({
  video: true,
  audio: true,
});

Browser bật webcam.

Sau đó:

  • tạo RTCPeerConnection
  • exchange SDP
  • ICE candidate
  • connect

Boom.

Hai browser tab nhìn thấy mặt nhau.

Lúc đó cảm giác kiểu:

“Ủa vậy là mình vừa build Zoom xong à?”


2. Khi mọi thứ vẫn còn màu hồng

Mọi thứ hoạt động cực kỳ hoàn hảo.

2 người call:

  • video mượt
  • latency thấp
  • CPU ổn
  • quạt laptop chưa kêu

Mình lúc đó tự tin lắm.

Kiểu:

“WebRTC dễ thế này mà mấy ông Zoom định giá tỷ đô?”

Sai lầm bắt đầu từ đây.


3. Và rồi mình test với… 6 người

Hôm đó mình rủ team vào test thử.

Khoảng:

  • 6 người
  • webcam bật full
  • vài người share screen

Và rồi…

mọi thứ bắt đầu nổ tung.


Triệu chứng:

  • CPU laptop tăng như coin mùa bull run
  • quạt quay như turbine máy bay
  • video lag
  • audio robotic
  • frame drop
  • Chrome ăn RAM như ăn buffet

Một đứa trong team hỏi:

“Mạng công ty lag à?”

Không.

Architecture lag.


4. Mesh architecture: “ai cũng nói chuyện với nhau”

Sau khi debug một hồi…

mình phát hiện ra một sự thật hơi đau lòng:

Mỗi user đang gửi video cho tất cả những người còn lại.

Ví dụ room có 4 người:

A <--> B
A <--> C
A <--> D

B <--> C
B <--> D

C <--> D

Ai cũng connect với nhau.

Ai cũng stream cho nhau.

Ai cũng encode cho nhau.

Một social network đúng nghĩa.


Đây gọi là:

Mesh Architecture

Nghe thì rất đẹp:

  • pure peer-to-peer
  • không cần media server mạnh
  • latency thấp
  • architecture đơn giản

Tutorial WebRTC nào cũng thích dùng Mesh.

Vì:

  • dễ demo
  • dễ hiểu
  • nhìn rất “distributed system”

Vấn đề là…

Mesh chỉ đẹp khi room còn ít người.


5. Laptop mình bắt đầu hóa thành lò sưởi

Giả sử:

  • webcam stream = 2 Mbps
  • room có 6 người

Mỗi user phải upload video tới 5 người khác.

Tức là:

2 \text{ Mbps} \times 5 = 10 \text{ Mbps upload}

Và đó mới chỉ là upload.


CPU cũng bắt đầu khóc.

Vì browser phải:

  • encode nhiều stream
  • encrypt SRTP
  • maintain hàng đống peer connection

Mỗi participant mới vào room giống như:

“thêm một quả tạ vào laptop.”


Số lượng connection cũng tăng rất kinh dị.

Nếu có n users.

Số connection sẽ là:

\frac{n(n-1)}{2}

Ví dụ:

  • 2 users → 1 connection
  • 5 users → 10 connections
  • 10 users → 45 connections

Đó là lúc mình hiểu:

Mesh không chết ngay lập tức.

Nó chết từ từ.

Rất từ từ.

Cho tới khi CPU fan bắt đầu hú.


6. SFU xuất hiện như một vị cứu tinh

Sau đó mình bắt đầu tìm hiểu:

“Ủa vậy Zoom sống kiểu gì?”

Và mình gặp:

SFU — Selective Forwarding Unit

Nghe tên khá intimidating.

Nhưng ý tưởng cực kỳ đơn giản.


Thay vì:

  • A gửi cho B/C/D/E

thì:

A -> SFU

SFU sẽ forward stream cho những người còn lại.

Ví dụ:

      SFU
    /  |  \
   A   B   C
        \
         D

Điểm quan trọng nhất:

User chỉ upload đúng một lần

Dù room có:

  • 5 người
  • 20 người
  • 100 người

thì laptop bạn vẫn chỉ upload:

  • 1 stream

Đó là khoảnh khắc mình kiểu:

“Àhhhhhhhhh… giờ thì hợp lý rồi.”


7. Tại sao Zoom không dùng Mesh?

Vì nếu Zoom dùng Mesh…

thì:

  • laptop sẽ bốc cháy
  • mobile sẽ thành bếp từ
  • WiFi sẽ biến mất khỏi Trái Đất

SFU giúp:

  • giảm upload bandwidth
  • giảm CPU client
  • giảm số peer connection
  • optimize stream quality

Ví dụ:

  • user đang nói → ưu tiên HD
  • user đang mute camera → giảm bitrate
  • tile nhỏ → gửi low resolution

SFU còn có thể:

  • simulcast
  • adaptive bitrate
  • congestion control
  • dynamic forwarding

Nói đơn giản:

SFU giống traffic controller của media stream.


8. Mesh vs SFU: cuộc chiến giữa sự đơn giản và scale

Mesh

Ưu điểm

  • đơn giản
  • peer-to-peer thật sự
  • dễ setup
  • latency thấp

Nhược điểm

  • không scale
  • upload tăng rất nhanh
  • CPU client đau khổ
  • mobile experience tệ

SFU

Ưu điểm

  • scale cực tốt
  • upload thấp
  • tối ưu bandwidth
  • phù hợp meeting đông người

Nhược điểm

  • cần media server
  • infra phức tạp hơn
  • tốn tiền hơn
  • debugging khó hơn

Một rule khá nổi tiếng:

“2 người dùng Mesh rất đẹp. 10 người dùng Mesh là crime.”


9. Điều mình học được sau cú lừa WebRTC đầu đời

Trước đây mình nghĩ video call chỉ là:

“Lấy webcam rồi stream đi.”

Sau khi tìm hiểu Mesh và SFU…

mình mới hiểu communication system thật ra là sự kết hợp của:

  • networking
  • distributed system
  • media processing
  • bandwidth optimization
  • realtime architecture

Điều thú vị nhất là:

Khi demo 2 người…

mọi architecture đều nhìn rất đẹp.

Nhưng chỉ cần scale lên…

mọi quyết định engineering bắt đầu lộ mặt thật.

Và đó là lúc mình hiểu:

“Build video call” không khó.

“Build video call cho hàng triệu người dùng” mới là thứ khiến Zoom trở thành công ty tỷ đô.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí