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