Rust cho Web: So sanh Actix Web va Axum cung Cau hoi Phong van 2026
Huong dan ky thuat toan dien so sanh kien truc, hieu suat va he sinh thai giua Actix Web 4.13 va Axum 0.8. Bao gom ket qua benchmark, vi du ma nguon va cau hoi phong van backend Rust.

Rust da khang dinh vi the la ngon ngu lap trinh he thong duy nhat dam bao an toan bo nho ma khong hy sinh hieu suat. Mo hinh ownership khong yeu cau garbage collector tai runtime mang lai toc do ngang hang C++ dong thoi loai bo cac loi null pointer va data race ngay tai giai doan bien dich. Nam 2026, hai framework thong tri he sinh thai web Rust: Actix Web va Axum. Mac du ca hai duoc xay dung tren cung mot ngon ngu, chung co su khac biet ro ret ve kien truc runtime, chien luoc middleware va tich hop he sinh thai. Bai viet nay phan tich ca hai framework o cap do ky thuat sau, trinh bay du lieu benchmark cap nhat va thao luan cac cau hoi phong van cho vi tri backend Rust.
Huong dan Lua chon Thuc te: Actix Web noi troi trong cac du an ma cac thao tac CPU-intensive chiem uu the va raw throughput la uu tien hang dau. Axum phu hop hon cho kien truc microservice can tich hop voi he sinh thai Tower, gRPC hoac chia se middleware theo mo-dun. Ca hai framework deu san sang cho production va dang duoc phat trien tich cuc.
Tiep can Kien truc: Mo hinh Pinned-Thread va Work-Stealing
Su khac biet can ban nhat giua Actix Web va Axum nam o mo hinh concurrency. Actix Web ap dung kien truc pinned-thread, trong do moi worker thread so huu Tokio runtime doc lap cua rieng minh. Voi thiet ke nay, mot request bat dau tren thread nao se tiep tuc duoc xu ly tren chinh thread do trong suot vong doi cua no. Ket qua la chi phi chia se du lieu giua cac thread duoc giam thieu toi da va cache locality duoc bao toan.
Axum su dung truc tiep work-stealing scheduler cua Tokio. Cac task duoc cac thread dang ranh dong tiep nhan. Cach tiep can nay dam bao su dung thread hieu qua trong cac tinh huong phan phoi tai khong deu, nhung co the phat sinh chi phi scheduler bo sung khi chuyen doi task.
Hai vi du server toi gian sau the hien ro su khac biet ve diem khoi dau:
use actix_web::{web, App, HttpServer, HttpResponse};
async fn health() -> HttpResponse {
HttpResponse::Ok().json(serde_json::json!({ "status": "ok" }))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.route("/health", web::get().to(health))
})
.bind("0.0.0.0:8080")?
.run()
.await
}use axum::{Router, Json, routing::get};
use serde_json::{json, Value};
async fn health() -> Json<Value> {
Json(json!({ "status": "ok" }))
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/health", get(health));
let listener = tokio::net::TcpListener::bind("0.0.0.0:8080")
.await
.unwrap();
axum::serve(listener, app).await.unwrap();
}Actix Web quan ly cau hinh runtime thong qua macro #[actix_web::main]; so luong worker, thoi gian shutdown va cai dat TLS duoc quan ly tai tang nay. Axum chay voi cau hinh mac dinh cua Tokio thong qua macro chuan #[tokio::main]. Lua chon nay tao nen tang cho viec tich hop khong ma sat giua Axum va he sinh thai Tokio.
Ve co che routing cung co su khac biet ro rang. Actix Web ho tro ca dinh nghia route dua tren macro (#[get("/")]) lan lap trinh, trong khi Axum chi ap dung cach tiep can lap trinh. Quyet dinh nay mang lai quyen kiem soat ro rang doi voi viec to hop router va giup xay dung cay route theo cach lap trinh de dang hon trong cac du an quy mo lon.
Do luong Hieu suat: Actix Web 4.13 vs Axum 0.8
Ket qua benchmark tong hop cho thay kha nang co ban cua framework, du khong phan anh truc tiep hieu suat ung dung thuc te. Khi cac thao tac I/O, truy cap co so du lieu va tang logic nghiep vu duoc them vao, su khac biet tu framework co xu huong tro nen khong dang ke. Tuy nhien, du lieu nay van cung cap cac chi so co y nghia ve hieu qua kien truc nen tang.
Cac ket qua sau duoc thu thap tren may chu voi bo xu ly AMD EPYC 7763 (64 loi) chay Ubuntu 24.04 su dung cong cu wrk voi 256 ket noi dong thoi:
| Chi tieu | Actix Web 4.13 | Axum 0.8.9 | |----------|---------------|-------------| | JSON serialization (req/s) | ~720.000 | ~640.000 | | Plain text (req/s) | ~980.000 | ~870.000 | | Single DB query (req/s) | ~180.000 | ~170.000 | | Memory usage (hello world) | ~8 MB | ~6 MB | | P99 latency (JSON) | 1,2 ms | 1,4 ms |
Actix Web mang lai loi the throughput khoang 10-15 phan tram cho cac thao tac HTTP thuan tuy. Su khac biet nay bat nguon tu loi the cache locality cua kien truc pinned-thread va viec toi uu hoa tang xu ly HTTP doc lap voi tang truu tuong Tower. Tuy nhien, trong cac tinh huong lien quan den truy cap co so du lieu, loi the nay giam xuong chi con vai diem phan tram.
Loi the cua Axum ve tieu thu bo nho khong nen bi bo qua. Kien truc gon nhe hon khong mang ha tang actor giu cho memory footprint cua may chu khi ranh o muc thap. Trong moi truong Kubernetes hoac serverless chay nhieu container instance dong thoi, su khac biet nay co the anh huong dang ke den tong chi phi tai nguyen.
Cac Mau Extractor va Xu ly Request
Ca hai framework deu ap dung mau Extractor de trich xuat du lieu type-safe tu HTTP request. Mac du phuc vu cung muc dich ve mat khai niem, chung co su khac biet ve cu phap va rang buoc.
Axum 0.8 su dung mo hinh ham dinh nghia cac extractor truc tiep lam tham so cua ham handler:
use axum::{
extract::{Path, Query, State, Json},
routing::get,
Router,
};
use serde::Deserialize;
use std::sync::Arc;
#[derive(Deserialize)]
struct Pagination {
page: Option<u32>,
per_page: Option<u32>,
}
struct AppState {
db_pool: sqlx::PgPool,
}
async fn get_user(
State(state): State<Arc<AppState>>,
Path(user_id): Path<i64>,
Query(pagination): Query<Pagination>,
) -> Json<serde_json::Value> {
let page = pagination.page.unwrap_or(1);
Json(serde_json::json!({
"user_id": user_id,
"page": page
}))
}Actix Web cung cap co che tuong tu thong qua cac kieu wrapper:
use actix_web::{web, HttpResponse};
use serde::Deserialize;
#[derive(Deserialize)]
struct Pagination {
page: Option<u32>,
per_page: Option<u32>,
}
struct AppState {
db_pool: sqlx::PgPool,
}
async fn get_user(
state: web::Data<AppState>,
path: web::Path<i64>,
query: web::Query<Pagination>,
) -> HttpResponse {
let user_id = path.into_inner();
let page = query.page.unwrap_or(1);
HttpResponse::Ok().json(serde_json::json!({
"user_id": user_id,
"page": page
}))
}Thay doi Breaking cua Axum 0.8: Cu phap tham so duong dan da thay doi tu dinh dang /:id sang dinh dang /{id}. Thay doi nay nham tang cuong tinh tuong thich voi tieu chuan URI template RFC 6570 va OpenAPI. Cac du an chuyen tu Axum 0.7 can cap nhat tat ca dinh nghia route.
Co mot su khac biet quy tac quan trong trong thu tu extractor: trong Axum, cac extractor tieu thu body request nhu Json va Body phai duoc dat lam tham so cuoi cung. Actix Web khong ap dung rang buoc nay. Tuy nhien, ca hai framework deu phat hien su khong khop kieu tai thoi diem bien dich nho he thong kieu manh, ngan ngua cac loi runtime.
Kien truc Middleware: Chuan Tower va He thong Rieng cua Actix
Tang middleware la mot trong nhung diem phan tach kien truc quyet dinh nhat giua hai framework. Axum uy thac toan bo viec quan ly middleware cho he sinh thai Tower. Trait Service cua Tower la framework-agnostic; middleware viet cho Tonic (gRPC), Hyper hoac bat ky dich vu tuong thich Tower nao co the duoc su dung trong Axum ma khong can sua doi.
use axum::{
Router, middleware,
routing::get,
extract::Request,
response::Response,
};
use tower_http::{
cors::CorsLayer,
compression::CompressionLayer,
trace::TraceLayer,
};
use std::time::Instant;
async fn timing_middleware(
request: Request,
next: middleware::Next,
) -> Response {
let start = Instant::now();
let response = next.run(request).await;
let duration = start.elapsed();
tracing::info!("Request took {:?}", duration);
response
}
fn build_router() -> Router {
Router::new()
.route("/api/data", get(|| async { "ok" }))
.layer(middleware::from_fn(timing_middleware))
.layer(CompressionLayer::new())
.layer(CorsLayer::permissive())
.layer(TraceLayer::new_for_http())
}Thu tu layer mang tinh quyet dinh: middleware duoc them cuoi cung se chay truoc (LIFO). Trong vi du tren, mot request lan luot di qua TraceLayer, CorsLayer, CompressionLayer va cuoi cung la timing middleware.
Actix Web phat trien ha tang middleware rieng dua tren trait Transform. He thong nay cho phep tuy chinh sau hon cho mot so truong hop su dung cu the, nhung khong tuong thich truc tiep voi he sinh thai Tower. Viec chia se middleware giua cac dich vu khac nhau doi hoi cac lop adaptor bo sung.
Sẵn sàng chinh phục phỏng vấn Rust?
Luyện tập với mô phỏng tương tác, flashcards và bài kiểm tra kỹ thuật.
Tich hop Co so Du lieu voi SQLx
SQLx la tieu chuan de facto cho truy cap co so du lieu bat dong bo trong he sinh thai Rust. SQLx xac thuc cac truy van SQL doi chieu voi schema co so du lieu thuc tai thoi diem bien dich, tu do bat duoc cac su khong khop kieu, loi chinh ta va tham chieu cot thieu trong qua trinh phat trien.
Viec tich hop SQLx voi ca hai framework co cau truc gan nhu dong nhat, vi SQLx hoat dong o cap connection pool doc lap voi tang HTTP:
use sqlx::PgPool;
#[derive(sqlx::FromRow, serde::Serialize)]
struct User {
id: i64,
email: String,
created_at: chrono::NaiveDateTime,
}
async fn find_user_by_email(
pool: &PgPool,
email: &str,
) -> Result<Option<User>, sqlx::Error> {
sqlx::query_as!(
User,
"SELECT id, email, created_at FROM users WHERE email = $1",
email
)
.fetch_optional(pool)
.await
}Su khac biet duy nhat giua cac framework nam o cach connection pool duoc truyen den cac ham handler: Actix Web su dung web::Data<PgPool>, trong khi Axum su dung State<Arc<PgPool>> hoac truc tiep State<PgPool> cho cac pool da implement trait Clone. Logic truy cap co so du lieu hoan toan co the chuyen doi giua hai framework.
Cac Mau Xu ly Loi
Trong cac API chat luong production, xu ly loi nhat quan mang tam quan trong then chot. Axum cung cap co che type-safe thong qua trait IntoResponse de chuyen doi loi ung dung thanh HTTP response:
use axum::{
http::StatusCode,
response::{IntoResponse, Response},
Json,
};
enum AppError {
NotFound(String),
DatabaseError(sqlx::Error),
ValidationError(String),
}
impl IntoResponse for AppError {
fn into_response(self) -> Response {
let (status, message) = match self {
AppError::NotFound(msg) => (
StatusCode::NOT_FOUND, msg
),
AppError::DatabaseError(_) => (
StatusCode::INTERNAL_SERVER_ERROR,
"Internal server error".to_string(),
),
AppError::ValidationError(msg) => (
StatusCode::BAD_REQUEST, msg
),
};
(status, Json(serde_json::json!({ "error": message })))
.into_response()
}
}
async fn get_user(
axum::extract::Path(id): axum::extract::Path<i64>,
) -> Result<Json<serde_json::Value>, AppError> {
if id <= 0 {
return Err(AppError::ValidationError(
"ID must be positive".to_string()
));
}
Ok(Json(serde_json::json!({ "id": id })))
}Actix Web su dung trait ResponseError. Su khac biet chinh: Actix Web yeu cau kieu loi implement ca trait std::fmt::Display va ResponseError, trong khi Axum chi can implement IntoResponse. Ve mat thuc te, viec dinh nghia kieu loi trong Axum can it boilerplate hon mot chut.
Huong dan Lua chon Framework
Khi nao nen Chon Actix Web
Uu tien raw throughput: Trong cac he thong ma moi micro-giay deu quan trong (giao dich tan suat cao, game server, CDN edge node), loi the throughput 10-15 phan tram cua Actix Web co the mang lai loi ich thuc te.
Da dau tu vao he sinh thai Actix: Cac du an su dung actix-rt, actix-codec hoac actix-web-actors co su tuong thich tu nhien voi Actix Web.
Ung dung WebSocket nang: Viec quan ly ket noi WebSocket thong qua mo hinh Actor bang actix-web-actors mang lai kien truc tu nhien va hieu qua cho cac ung dung thoi gian thuc.
Khi nao nen Chon Axum
Tich hop he sinh thai Tower: Trong cac du an lam viec voi Tonic (gRPC), Hyper hoac cac dich vu dua tren Tower khac, loi the tai su dung middleware la rat dang ke.
Kien truc toi gian va minh bach: Cac doi muon co tam nhin va quyen kiem soat toi da doi voi qua trinh xu ly HTTP se thay cach tiep can cua Axum giup debug de dang hon.
Memory footprint thap: Trong cac trien khai serverless hoac moi truong chay nhieu instance dong thoi, muc su dung bo nho co ban thap hon cua Axum co the tac dong tich cuc den tong chi phi ha tang.
Tich hop Tokio: La thanh phan chinh thuc cua du an Tokio, Axum thich ung nhanh voi cac phien ban Tokio moi nhat va tuan thu nhat quan cac nguyen tac thiet ke cua Tokio.
Cau hoi Phong van va Tra loi
Cac cau hoi sau bao gom nhung chu de xuat hien thuong xuyen nhat trong cac cuoc phong van ky thuat cho vi tri backend Rust nam 2026.
Cau hoi 1: Su khac biet kien truc co ban giua Actix Web va Axum la gi?
Actix Web ap dung mo hinh pinned-thread; moi worker thread quan ly Tokio runtime doc lap va cac request tiep tuc duoc xu ly tren thread noi chung bat dau. Axum su dung truc tiep work-stealing scheduler cua Tokio; cac task duoc cac thread ranh dong tiep nhan. Su khac biet nay anh huong truc tiep den dac tinh hieu suat va tich hop he sinh thai.
Cau hoi 2: Mau Extractor trong Axum hoat dong nhu the nao?
Extractor la cac kieu implement trait FromRequest hoac FromRequestParts. Khi duoc dinh nghia lam tham so cua ham handler, chung tu dong trich xuat du lieu tu HTTP request den. Quy tac then chot: cac extractor tieu thu body request (Json, Body) phai luon duoc dat lam tham so cuoi cung.
Cau hoi 3: Tai sao State trong Axum can duoc boc bang Arc?
Cau truc Router cua Axum phai implement trait Clone. Vi State la mot phan cua Router nen no phai co the clone duoc. Arc<T> cho phep clone hieu qua thong qua reference counting. Doi voi cac kieu da implement Clone (nhu SQLx pool), khong can wrapper Arc.
Cau hoi 4: Su khac biet chinh giua Tower middleware va Actix middleware la gi?
Tower middleware implement trait Service tong quat va framework-agnostic; co the su dung ma khong can sua doi trong Axum, Tonic va Hyper. Actix middleware dac thu cho Actix Web va khong tuong thich truc tiep voi cac dich vu Tower. Trong cac kien truc can chia se middleware giua cac dich vu khac nhau, cach tiep can Tower mang lai loi the ro rang.
Cau hoi 5: Xac thuc truy van compile-time cua SQLx hoat dong nhu the nao?
SQLx ket noi voi co so du lieu thuc trong qua trinh bien dich thong qua macro query_as! de xac minh tinh dung cu phap SQL, su khop kieu va su ton tai cua cot. Ten cot sai hoac su khong khop kieu duoc bao cao la loi bien dich. Cho moi truong CI/CD, cac tap metadata duoc tao truoc bang lenh cargo sqlx prepare cho phep bien dich offline.
Cau hoi 6: Ly do dang sau thay doi cu phap /{id} trong Axum 0.8 la gi?
Axum 0.8 thay doi cu phap tham so duong dan tu ky phap kieu Express /:param sang ky phap /{param} tuan thu RFC 6570. Thay doi nay tang cuong kha nang tuong tac voi cac cong cu tai lieu OpenAPI va tao su nhat quan voi cac web framework o cac ngon ngu lap trinh khac.
Cau hoi 7: Nhung tieu chi nao quyet dinh viec lua chon framework web Rust cho moi truong production?
Qua trinh ra quyet dinh can xem xet kinh nghiem cua doi, nhu cau tich hop voi he sinh thai Tower, yeu cau tai su dung middleware, muc do nhay cam ve hieu suat, nhu cau WebSocket hoac streaming, va ke hoach bao tri dai han cua du an. Vi su khac biet hieu suat 10-15 phan tram la khong dang ke voi hau het cac ung dung, quyet dinh thuong duoc dinh hinh boi su phu hop he sinh thai va nang luc cua doi.
Loi Thuong gap trong Phong van: Ung vien thuong nham lan giua su khac biet cua lap trinh dong bo va bat dong bo voi su khac biet cua framework. Ca hai framework deu hoan toan bat dong bo va su dung Tokio runtime. Su khac biet thuc su nam o muc do truu tuong va tich hop he sinh thai. Ngoai ra, viec tuyen bo mot framework vuot troi tuyet doi so voi framework kia ma khong de cap boi canh se tao an tuong tieu cuc ve nang luc danh gia ky thuat.
Ket luan
Su lua chon giua Actix Web va Axum lien quan truc tiep den nhu cau ky thuat cua du an va nang luc cua doi. Uu va nhuoc diem cua ca hai lua chon co the duoc tom tat nhu sau:
- Actix Web 4.13 mang lai raw throughput cao hon 10-15 phan tram trong cac benchmark tong hop, he sinh thai chin muoi va ho tro mo hinh Actor tich hop
- Axum 0.8 noi bat voi tinh tuong thich Tower, thiet ke toi gian, tich hop Tokio chat che va memory footprint thap hon
- Ca hai framework deu da duoc chung minh trong moi truong production va duoc su dung tich cuc trong cac he thong quy mo lon
- Trong cac ung dung thuc te co lien quan den thao tac I/O, su khac biet hieu suat tu framework giam xuong muc co the bo qua
- SQLx va cac thu vien co so du lieu khac hoat dong giong nhau tren ca hai framework, giu cho tang co so du lieu doc lap voi lua chon framework
- Doi voi cac du an moi khong co uu tien san co, Axum cung cap diem khoi dau thuc dung nho tinh tuong thich rong voi he sinh thai Tower va su ho tro to chuc cua Tokio
- Cac doi da co kinh nghiem voi Actix Web khong co ly do bat buoc de chuyen doi; ca hai con duong deu cung cap nen tang vung chac va hieu suat cao de xay dung web service
Bắt đầu luyện tập!
Kiểm tra kiến thức với mô phỏng phỏng vấn và bài kiểm tra kỹ thuật.
Thẻ
Chia sẻ
Bài viết liên quan

Async/Await trong Rust: Giải thích Tokio, Futures và Đồng thời Bất đồng bộ
Tìm hiểu chi tiết về lập trình bất đồng bộ trong Rust với async/await, runtime Tokio, trait Future, và các mẫu thiết kế đồng thời phổ biến trong phỏng vấn kỹ thuật.

Ownership và Borrowing trong Rust: Hướng dẫn toàn diện cho phỏng vấn kỹ thuật
Tìm hiểu sâu về hệ thống Ownership và Borrowing trong Rust — từ khái niệm cơ bản đến các pattern nâng cao giúp lập trình viên tự tin vượt qua phỏng vấn kỹ thuật.

Ownership và Borrowing trong Rust: Hướng Dẫn Toàn Diện
Làm chủ hệ thống ownership và borrowing của Rust. Quy tắc sở hữu, tham chiếu, lifetime và các mẫu quản lý bộ nhớ nâng cao.