Rust WebRTC P2P #3 - SIP overview + Why choose Rust

Rust WebRTC P2P #3 - SIP overview + Why choose Rust

So sánh SIP (giao thức signaling truyền thống trong telephony) với WebRTC signaling nhẹ hơn, phù hợp browser. Đi sâu vào 4 lý do chọn Rust: hiệu năng không GC pause, safety ngăn data race từ compile time (Arc, DashMap, mpsc), async mạnh mẽ với Tokio, và cơ chế bắt buộc xử lý lỗi — yếu tố sống còn khi server chịu hơn 100K cuộc gọi/ngày.

1. SIP Overview

SIP (Session Initiation Protocol) là giao thức signaling truyền thống trong hệ thống telephony. • Được dùng rộng rãi trong VoIP enterprise: tổng đài, call center, IP PBX • Hoạt động theo mô hình request/response tương tự HTTP • Các method chính: INVITE (mời gọi), ACK (xác nhận), BYE (kết thúc), REGISTER (đăng ký) • Nhược điểm: Phức tạp, nhiều header, khó triển khai trên web browser

2. SIP vs WebRTC Signaling

• SIP: Giao thức chuẩn hóa, cứng nhắc, phù hợp hệ thống telephony truyền thống • WebRTC Signaling: Không quy định giao thức cụ thể — bạn tự chọn (WebSocket, HTTP, MQTT...) → WebRTC linh hoạt hơn, nhẹ hơn, và phù hợp với ứng dụng web hiện đại. SIP vẫn quan trọng khi cần tích hợp với hạ tầng telephony có sẵn.

3. Tại sao chọn Rust?

4 lý do chọn Rust để xây dựng Signaling Server: 1. Hiệu năng cao: Không có Garbage Collector → Không bị GC pause, latency ổn định — yếu tố sống còn cho real-time communication. 2. Memory Safety: Ownership system ngăn data race từ compile time. Sử dụng Arc, DashMap, mpsc channel an toàn khi xử lý hàng nghìn kết nối đồng thời. 3. Async mạnh mẽ: Tokio runtime với thread pool xử lý hàng nghìn WebSocket connection hiệu quả mà không cần tạo thread cho mỗi connection. 4. Error Handling bắt buộc: Result buộc dev phải xử lý mọi trường hợp lỗi — giảm thiểu crash trong production khi server chịu hơn 100K cuộc gọi/ngày.

4. So sánh Rust với các ngôn ngữ khác

• Node.js: Dễ viết, ecosystem lớn, nhưng single-threaded và GC pause có thể gây jitter trong audio • Go: Concurrency tốt với goroutine, nhưng GC vẫn là vấn đề với latency nhạy cảm • C/C++: Hiệu năng cao nhưng dễ gặp memory leak, buffer overflow, data race • Rust: Kết hợp hiệu năng của C/C++ với safety của ngôn ngữ bậc cao → Lựa chọn tối ưu cho VoIP server

5. Khi nào nên dùng Rust cho VoIP?

• Hệ thống yêu cầu latency thấp và ổn định (< 150ms cho audio call) • Server cần xử lý lượng lớn concurrent connections (10K+ WebSocket) • Môi trường production cần độ tin cậy cao, ít crash • Team sẵn sàng đầu tư learning curve để đổi lấy hiệu năng và safety dài hạn

Bài học liên quan

Xem khóa học
Rust WebRTC P2P #1 - Giới thiệu khóa học
5:29

Rust WebRTC P2P #1 - Giới thiệu khóa học

Chào mừng bạn đến với series Rust VoIP! Trong bài mở đầu, bạn sẽ nắm được bức tranh toàn cảnh: mục tiêu xây dựng Signaling Server bằng Rust, kiến trúc P2P (Browser ↔ Rust Server ↔ Browser), tech stack sử dụng (Axum, Tokio, WebSocket, MongoDB, JWT), và lộ trình 7 phần của toàn bộ series từ WebRTC đến CRM/Queue.

Bài 1
Rust WebRTC P2P #2 - VoIP là gì? WebRTC là gì?
7:13

Rust WebRTC P2P #2 - VoIP là gì? WebRTC là gì?

Hiểu bản chất VoIP — công nghệ truyền thoại/video qua mạng IP đứng sau Skype, Zoom, Google Meet. Sau đó khám phá WebRTC — bộ tiêu chuẩn cho phép trình duyệt giao tiếp trực tiếp peer-to-peer: media đi thẳng giữa hai browser, server chỉ làm nhiệm vụ signaling duy nhất.

Bài 2
Rust WebRTC P2P #4 - Install Rust + RustRover + Cargo Commands
7:36

Rust WebRTC P2P #4 - Install Rust + RustRover + Cargo Commands

Thực hành cài đặt Rust Toolchain qua rustup.rs trên Windows/Linux/macOS và xác thực bằng rustc, cargo, rustup. Khám phá RustRover — IDE chuyên biệt giúp code Rust nhanh hơn VS Code. Làm quen 4 lệnh Cargo thiết yếu: cargo new, cargo build, cargo build --release và cargo run.

Bài 4
Rust WebRTC P2P #5 - Hello World + Tokio Runtime + Cargo.toml
5:13

Rust WebRTC P2P #5 - Hello World + Tokio Runtime + Cargo.toml

Khám phá Cargo.toml — trái tim quản lý dependencies của mọi dự án Rust. Khai báo các thư viện sẽ dùng xuyên suốt khóa học: Axum, Tokio, Serde, DashMap, UUID, Log4rs, Anyhow. Cấu hình Tokio Runtime biến hàm main thành async, tận dụng thread pool xử lý hàng nghìn kết nối đồng thời. Kết thúc bằng việc chạy thành công project Hello World đầu tiên.

Bài 5
Rust WebRTC P2P #6 - Axum Server + Config Loading
42:44

Rust WebRTC P2P #6 - Axum Server + Config Loading

Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) với Rust Trong phần 6 này: Chúng ta bắt đầu xây dựng backend → Thiết lập hệ thống cấu hình (Config) → Khởi tạo Axum HTTP Server

Bài 6
Rust WebRTC P2P #7 - MongoDB + Logging with log4rs
15:44

Rust WebRTC P2P #7 - MongoDB + Logging with log4rs

Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) bằng Rust Trong video 7 này: Chúng ta hoàn thiện nền tảng Signaling Server với 2 phần quan trọng: - Cấu hình MongoDB - Thiết lập hệ thống Logging với log4rs

Bài 7
Rust WebRTC P2P #8 - Create WebSocket Endpoint with Axum
15:45

Rust WebRTC P2P #8 - Create WebSocket Endpoint with Axum

WebSocket là giao thức giữ kết nối hai chiều liên tục — khác HTTP request/response. Trong signaling server, mỗi user kết nối WebSocket và giữ kết nối suốt session

Bài 8
Rust WebRTC P2P #9 - ConnectionState — Client Online management
8:46

Rust WebRTC P2P #9 - ConnectionState — Client Online management

Chào mừng bạn quay trở lại với series WebRTC Peer-to-Peer (P2P) bằng Rust Trong phần 9 này: Chúng ta xây dựng một thành phần cốt lõi của Signaling Server → Quản lý trạng thái kết nối (Connection State) → Quản lý danh sách user đang online

Bài 9
Rust WebRTC P2P #10 - Message Routing — Dispatcher Pattern
9:37

Rust WebRTC P2P #10 - Message Routing — Dispatcher Pattern

Trong phần 10 này, chúng ta sẽ tiến hành chuẩn hóa cách thức trao đổi dữ liệu giữa Client và Server thông qua WebSocket bằng cách xây dựng hệ thống Message Routing và áp dụng Dispatcher Pattern.

Bài 10
Rust WebRTC P2P #11 - Nginx Config + Deploy Live on VPS
16:28

Rust WebRTC P2P #11 - Nginx Config + Deploy Live on VPS

Chúng ta đưa Signaling Server từ local lên VPS thực tế → Cấu hình domain → Setup Nginx → Thiết lập HTTPS (SSL)

Bài 11
Rust WebRTC P2P #12 - User Model + MongoDB Queries
4:34

Rust WebRTC P2P #12 - User Model + MongoDB Queries

Trong phần này, mình bắt đầu xây dựng Data Layer cho hệ thống, bao gồm User Model và các truy vấn MongoDB. Đây là nền tảng quan trọng để triển khai Login và Authentication cho cả REST API và WebSocket server.

Bài 12
Rust WebRTC P2P #13 - Login Service + JWT + Argon2
22:03

Rust WebRTC P2P #13 - Login Service + JWT + Argon2

Trong phần 13 này, chúng ta triển khai một trong những tính năng quan trọng nhất của backend: Login Service. Mục tiêu là xây dựng cơ chế xác thực an toàn, sử dụng JWT và các tiêu chuẩn bảo mật hiện đại để bảo vệ thông tin người dùng.

Bài 13
Rust WebRTC P2P #14 - Auth Middleware HTTP + WebSocket Auth Flow
50:35

Rust WebRTC P2P #14 - Auth Middleware HTTP + WebSocket Auth Flow

Trong phần 14 này, chúng ta thực hiện một bước rất quan trọng để bảo vệ hệ thống: xây dựng Middleware cho HTTP Server và thiết lập luồng xác thực cho WebSocket. Đây là lớp bảo vệ giúp đảm bảo chỉ những người dùng hợp lệ mới có thể truy cập API và thiết lập kết nối signaling.

Bài 14
Rust WebRTC P2P #15 - Demo Login + WebSocket Auth từ Postman
5:12

Rust WebRTC P2P #15 - Demo Login + WebSocket Auth từ Postman

Trong phần 15 này, chúng ta thực hiện demo toàn bộ quy trình xác thực đã xây dựng ở các phần trước. Sử dụng Postman để mô phỏng client, chúng ta sẽ kiểm tra cách server xử lý token thông qua cả HTTP và WebSocket.

Bài 15
Rust WebRTC P2P #16 - State Pattern — P2PCallStateHandler Trait
12:04

Rust WebRTC P2P #16 - State Pattern — P2PCallStateHandler Trait

Trong phần 16 này, chúng ta đi vào một thành phần rất quan trọng trong kiến trúc của signaling server: State Pattern. Đây là phần “trái tim” giúp điều khiển toàn bộ luồng xử lý của một cuộc gọi, từ lúc bắt đầu cho đến khi kết thúc.

Bài 16