· Phạm Thành Nam · Ngôn ngữ Rust · 4 phút đọc

30 Ngày học Rust - Day 29: Lên đỉnh Web Server Thực Chiến với Axum và Tokio

Day 29: Hãy quên Web Server tự làm bằng tay đi. Khám phá cách các ông lớn tại Discord và AWS viết Backend Rust chịu tải hàng triệu Request bằng Axum và Async/Await.

Day 29: Hãy quên Web Server tự làm bằng tay đi. Khám phá cách các ông lớn tại Discord và AWS viết Backend Rust chịu tải hàng triệu Request bằng Axum và Async/Await.

Async/Await: Chìa khoá Cân Nửa Triệu Connection

Project Nhóm ThreadPool 4 Thợ của chúng ta ở Ngày 28 là một kiệt tác Học Thuật. Nhưng ở ngoài thương trường, nếu Discord dùng 4 Thợ đó (Hay kể cả 40 Thợ Thread), họ sẽ sập Server khi có 1 Triệu người dùng Online cùng lúc! Tốn Ram và Phí tài nguyên tạo Thread.

Giải pháp tối thượng của Lập Trình Hiện Đại (Kể cả Node.js) là Cấu Trúc Bất Đồng Bộ Async/Await chạy dưới Mô Hình Event Loop. Ở Rust, thư viện lõi không có Sẵn Event Loop. Cộng đồng đã chế tạo ra một Cỗ Sinh Lực Khép Tín Khủng Khiếp Nhất Thế Giới: Thư viện nền tảng Tokio và Thư viện Tầng Web Axum.

Mô phỏng hàng vạn luồng kết nối không nghẽn qua Axum và Tokio

1. Khai Cổng Trạm Phát Tokio

Rust Cho Phép Bạn Trang Bị Lõi Máy Động Cơ Khác Nhau Dưới Hàm Main Bằng 1 Procedural Macro của Tokio:

// Bạn phải cài package: cargo add tokio axum
#[tokio::main]
async fn main() {
    println!("Trạm Không Gian Bất Đồng Bộ Tokio Đã Khởi Động Kích Hoạt");
}

Nhờ Chữ #[tokio::main], Hàm main Của Bạn Đã Biến Thành Trạm Phát Vạn Luồng Băng Chuyền Quét Event Ngầm Đáy Đích Mượt Mà, Cho Phép Gắn Biển async Lên Đỉnh Nó Để Mọi Phép Nhây Đợi (I/O, Mạng, Ổ Cúng) Giải Phóng Lực Cản CPU CPU Mở Mắt Đón Khách Khác!

2. Dựng Router Web Tuyệt Phẩm Bằng Axum

Nếu Ở Day 26 Bạn Chế Switch Lọc Route Lỗ Thủng 404 Cân Mỏi Gân Code, Axum Quẹt Nó Bằng Khung Tác Cấu Sương Gọi Method Thần Thánh.

use axum::{routing::get, Router};
use std::net::SocketAddr;
use tokio::net::TcpListener;

#[tokio::main]
async fn main() {
    // Rắp Trục Router - Đục Mép Đường Dẫn Route Dưới Nửa Giây
    let app = Router::new()
        .route("/", get(trang_chu))
        .route("/profile", get(trang_ca_nhan));

    // Xin Mở Cổng TCP Qua Bệ Phóng Tokio 
    let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
    println!("Server Axum Rung Nhịp Tại Cảng 3000 Bắn Tốc!");
    axum::serve(listener, app).await.unwrap();
}

// Handler Functions (Code Khớp Nhiệm Vụ Khi Người Khách Vô Route)
async fn trang_chu() -> &'static str {
    "Xin Chào Lịch Sử, Tôi Là Axum Chân Mệnh Web"
}
async fn trang_ca_nhan() -> &'static str {
    "Thông Tin Tuyệt Mật Của Tài Khoản Admin 🚀"
}

Axum Chạy Chễm Chệ Siêu Cấp. Cái Chữ .await Cắm Vút Là Hành Động “Bỏ Giỏ Luồng Chờ Rớt Kế Nhanh Không Chiếm CPU Đỉnh Kéo Chờ Ngang Giây Ngủ”.

3. Tương Lai Trải Đều Ở Macros Trích Data (Extractors)

Khác Với Cực Hình Mòn Mỏi Rạch Cát Đo Mảng Vector Kẻ Lòng Request Thủ Công Ở Bài 25. Bạn Nhận JSON Post Khách Gửi Qua POST Cực Magic :

use axum::{Json, routing::post};
use serde::Deserialize; // Macro Procedural Rã Bọc Sinh Lệnh Phân JSON 

#[derive(Deserialize)]
struct TaiKhoanTao {
    ten: String,
    tuoi: u8,
}

// Axum Tự Trích Khối Data Vọc Gói Vào Biến Json Luôn, Không Trật Code, Cần Khai Căn Kiểu Dáng
async fn tao_user(Json(khach): Json<TaiKhoanTao>) -> String {
    format!("Tạo Thành Cấp Bạn {} Năm Nay {} Tuổi", khach.ten, khach.tuoi)
}
// Chèn Vào Hàm Main: .route("/users", post(tao_user))

Câu hỏi thường gặp (FAQ)

Nên Dùng Axum Hay Actix-Web?

Cả 2 Đều Xuyên Top Techempower (Bảng Xếp Hạng Tốc Độ Chạy Toàn Cầu Đo Bằng Trăm Ngàn Requests Một Giây). Actix Mệnh Danh Bố Trẻ Cũ Gắt Đồ Sộ, Trụ Tính Điển Lâu Cực Đỉnh Khỏe. Axum Đẻ Say Dưới Chái Tán Tổ Đội Tokio Cha Đẻ Chính Lòng. Axum Dùng Lõi Vi Kiến Trúc Service Cực Gắn Liền Chặt Không Kém Độ Thuật Vi Sinh Gọn Gàng. Trend Dev Hiện Nay Là Trượt Thắng Cho Axum. Thiết Kế Router Đọc Sướng Không Cấn Nghẹt Đáy!


Sẵn sàng cho Ngày 30? Chấn Cực Phóng Máy. 29 Ngày Lật Mở Code Gầy Đen. Tuột Bỏ Cái Kéo Lịch Sự Của C/C++. Khảo Nát Try Catch Của C# Mòn Java. Quấy Mảng Biến Tính Tùy JavaScript Mất Kiểm Type Bất Cẩn. Ta Nhìn Lại Toàn Đội Đúc Khối Sáng Mắt Của Tháp Vàng Cao Trữ Tại: [Day 30: Chứng Chỉ Tinh Hoa - Đúc Kết Hành Trình RUST Dành Cho Vị Thần Lập Trình Mới].

Chuỗi bài viết

30 Ngày Trở Thành Rustacean Tinh Hoa

Phần 29 / 30

30 bài viết
  1. Phần 1 30 Ngày học Rust - Day 1: Lời chào thế giới và Vũ khí Cargo
  2. Phần 2 30 Ngày học Rust - Day 2: Biến, Bất biến (Mutability) và Shadowing
  3. Phần 3 30 Ngày học Rust - Day 3: Luồng điều khiển (Control Flow) và sức mạnh của Match
  4. Phần 4 30 Ngày học Rust - Day 4: Ownership - Khái niệm định hình cỗ thần khí Rust
  5. Phần 5 30 Ngày học Rust - Day 5: Khóa học nhặt đồ chung với References & Borrowing
  6. Phần 6 30 Ngày học Rust - Day 6: Đắp nặn dự án với Structs và Methods
  7. Phần 7 30 Ngày học Rust - Day 7: Quyền năng vô song của Enums và Pattern Matching
  8. Phần 8 30 Ngày học Rust - Day 8: Quản lý dự án với Packages, Crates và Modules
  9. Phần 9 30 Ngày học Rust - Day 9: Các bộ sưu tập chung (Vectors, Strings, Hash Maps)
  10. Phần 10 30 Ngày học Rust - Day 10: Trị dứt điểm Ác mộng Lỗi (Error Handling)
  11. Phần 11 30 Ngày học Rust - Day 11: Generics - Ma thuật Đa hình kiểu dữ liệu
  12. Phần 12 30 Ngày học Rust - Day 12: Traits - Kẻ ban phát quyền năng và Lập pháp Hành vi
  13. Phần 13 30 Ngày học Rust - Day 13: Vượt qua Boss cuối 'Lifetimes' - Sinh Mệnh Biến
  14. Phần 14 30 Ngày học Rust - Day 14: Tận diệt Bug từ trứng nước bằng Automated Tests
  15. Phần 15 30 Ngày học Rust - Day 15: Thực chiến Build Command Line App (CLI) đầu đời
  16. Phần 16 30 Ngày học Rust - Day 16: Functional Magic chốn trần gian (Closures & Iterators)
  17. Phần 17 30 Ngày học Rust - Day 17: Quyền năng của Smart Pointers
  18. Phần 18 30 Ngày học Rust - Day 18: Chinh phục Da luồng (Concurrency) - Cú đâm quyết định của Rust
  19. Phần 19 30 Ngày học Rust - Day 19: Tranh cãi Lập trình hướng đối tượng (OOP) trong Rust
  20. Phần 20 30 Ngày học Rust - Day 20: Mổ xẻ nghệ thuật Advanced Pattern Matching
  21. Phần 21 30 Ngày học Rust - Day 21: Sức mạnh tối thượng của Advanced Traits
  22. Phần 22 30 Ngày học Rust - Day 22: Về Phe Bóng Tối với Unsafe Rust
  23. Phần 23 30 Ngày học Rust - Day 23: Quyền năng của Đấng Tạo Hóa (Declarative Macros)
  24. Phần 24 30 Ngày học Rust - Day 24: Siêu Năng Lực Procedural Macros (Macro Thủ Tục)
  25. Phần 25 30 Ngày học Rust - Day 25: Xây dựng TCP Web Server Đa Luồng (Phần 1: Lõi Socket)
  26. Phần 26 30 Ngày học Rust - Day 26: Xây dựng TCP Web Server Đa Luồng (Phần 2: Bắn trả File HTML)
  27. Phần 27 30 Ngày học Rust - Day 27: Xây dựng TCP Web Server Đa Luồng (Phần 3: The Thread Pool)
  28. Phần 28 30 Ngày học Rust - Day 28: Xây dựng TCP Web Server Đa Luồng (Phần 4: Graceful Shutdown)
  29. Phần 29 30 Ngày học Rust - Day 29: Lên đỉnh Web Server Thực Chiến với Axum và Tokio
  30. Phần 30 30 Ngày học Rust - Day 30: Vượt Vọng Vàng - Đúc Kết Hành Trình Rustacean Tinh Hoa

Bình luận

Quay lại Blog

Bài viết liên quan

Xem tất cả bài viết »