Backend Python & FastAPI — API hiện đại, dễ mở rộng
FastAPI là framework Python tham chiếu cho API REST bất đồng bộ. Nó kết hợp type hint gốc của Python với xác thực Pydantic tự động, tài liệu OpenAPI tự sinh và hiệu suất ASGI bất đồng bộ — mà không hy sinh khả năng đọc mã.
FastAPI — framework API cho Python
FastAPI chạy trên Uvicorn (máy chủ ASGI) cùng Gunicorn cho đa tiến trình trong production. Một endpoint đọc dữ liệu từ cache Redis mà không cần truy vấn cơ sở dữ liệu cho mỗi request. Dependency Injection gốc cho phép kiểm thử cô lập bất kỳ tầng nào mà không cần mock phức tạp: xác thực, phiên cơ sở dữ liệu, giới hạn tốc độ — mỗi thứ đều là một dependency có thể tiêm.
Tài liệu OpenAPI 3.1 được tự động sinh từ type hint — Swagger UI và ReDoc có sẵn tại `/docs` và `/redoc` trong môi trường phát triển. Schema Pydantic v2 (bộ xác thực viết bằng Rust) xác thực request và response nhanh hơn Pydantic v1 từ 10–20 lần. Mọi trường không hợp lệ đều trả về lỗi 422 với thông báo rõ ràng, được địa phương hóa.
- async/await gốc — I/O không chặn trên mọi thao tác DB và HTTP
- BackgroundTasks cho các thao tác sau phản hồi (email, webhook, log)
- Hỗ trợ WebSocket gốc cho tính năng thời gian thực (chat, thông báo)
- Giới hạn tốc độ với slowapi (dựa trên limits) — theo từng IP và từng người dùng
- CORS, nén (gzip/brotli), request ID, middleware đo thời gian
PostgreSQL, SQLAlchemy và Alembic
Chúng tôi dùng SQLAlchemy 2.0 async (driver asyncpg) cho mọi thao tác DB. Các model được định nghĩa với kiểu Mapped — an toàn kiểu, không dùng chuỗi. Truy vấn phức tạp được viết bằng SQLAlchemy Core (kiểm tra lúc biên dịch) hoặc SQL thuần qua `text()` với bind parameter — không bao giờ nối chuỗi (giúp ngăn chặn SQLi).
Migration Alembic được tự động sinh từ thay đổi của model và được xem xét thủ công trước khi áp dụng. Mỗi migration có `upgrade()` và `downgrade()` đã được kiểm thử. Trong production, migration chạy trong CI trước khi triển khai — cơ sở dữ liệu luôn đồng bộ với mã. Connection pooling qua asyncpg với kích thước pool cấu hình được cho từng dịch vụ.
- Khóa mức hàng với `SELECT ... FOR UPDATE` cho các thao tác đồng thời quan trọng
- Tìm kiếm toàn văn với pg_trgm và tsvector — không cần Elasticsearch cho các trường hợp đơn giản
- JSONB cho dữ liệu bán cấu trúc với chỉ mục GIN
- Bảng phân vùng (partition) cho các bảng có hàng triệu dòng (log, sự kiện)
Cache Redis và khả năng mở rộng ngang
Redis 7 được dùng cho cache ứng dụng (TTL theo từng endpoint), lưu trữ phiên (refresh token JWT với thu hồi có chọn lọc), pub/sub cho sự kiện thời gian thực và hàng đợi cho tác vụ nền (Celery hoặc ARQ). Chiến lược cache là cache-aside với vô hiệu hóa tường minh — không phải TTL mù quáng có thể trả về dữ liệu cũ.
- Xác thực JWT với access token (15 phút) + refresh token Redis (7 ngày)
- Celery + Redis broker cho tác vụ bất đồng bộ (tạo PDF, email, nhập dữ liệu)
- Endpoint health check `/health` với trạng thái DB, Redis và phiên bản triển khai
- Ghi log JSON có cấu trúc (structlog) — tương thích Loki/Datadog/ELK
Ưu điểm và hạn chế
Ưu điểm
- Mô hình ASGI bất đồng bộ, phù hợp các tác vụ I/O.
- Tài liệu OpenAPI tự sinh từ type hint.
- Xác thực Pydantic v2 nhanh, kèm lỗi 422 rõ ràng.
- Mã dễ đọc, Python quen thuộc với hầu hết các đội ngũ.
Hạn chế
- Python vẫn chậm hơn Go hoặc Rust ở các tác vụ nặng về CPU.
- async/await đòi hỏi kỷ luật — một lệnh gọi chặn có thể làm đứng cả event loop.
- Hệ sinh thái trẻ hơn Django về các tính năng tích hợp sẵn.
- Không có ORM hay trang admin tích hợp — bạn chọn riêng từng thứ.
Kết luận nhanh
Hãy chọn FastAPI cho API REST bất đồng bộ, microservice và backend cho SPA/di động. Với các ứng dụng cực kỳ nặng về CPU hoặc monolith cần admin dựng sẵn, lần lượt Go hoặc Django có thể phù hợp hơn.
Bảng thông số kỹ thuật
| Khả năng | Giới hạn / ngưỡng | Trường hợp sử dụng điển hình | |
|---|---|---|---|
| Đồng thời | async/await, I/O không chặn | Tác vụ nặng CPU cần worker riêng | API có nhiều lệnh gọi DB/HTTP |
| Độ trễ | Endpoint đọc từ cache Redis, không cần truy vấn DB cho mỗi request | Tăng khi tuần tự hóa payload lớn | SaaS, di động, backend thời gian thực |
| Xác thực & tài liệu | Pydantic v2 + OpenAPI 3.1 tự động | Schema phức tạp làm tăng thời gian khởi động | API công khai với Swagger/ReDoc |
| Chi phí điển hình | Mã nguồn mở, chạy trên 1 vCPU | Mở rộng ngang cần thêm tiến trình | Từ MVP đến production |
FastAPI so với các giải pháp thay thế
| Tiêu chí | FastAPI | Django / Express |
|---|---|---|
| Hiệu suất bất đồng bộ | Xuất sắc (ASGI gốc) | Django một phần, Express tốt |
| Tài liệu OpenAPI tự động | Có, từ type hint | Cần thêm gói bổ sung |
| Admin / ORM tích hợp | Không (chọn riêng) | Django: có; Express: không |
Câu hỏi thường gặp
FastAPI có nhanh hơn Django không?
Có với tác vụ I/O. FastAPI chạy bất đồng bộ trên ASGI, nên xử lý được nhiều request đồng thời có gọi DB/HTTP hiệu quả hơn Django đồng bộ cổ điển. Tuy nhiên, Django có nhiều tính năng tích hợp hơn.
FastAPI không phù hợp với việc gì?
Với các tác vụ nặng về CPU (xử lý ảnh, tính toán số học nặng), Python chậm hơn Go hoặc Rust; bạn chuyển chúng sang worker riêng. FastAPI cũng không có admin dựng sẵn như Django.
FastAPI có cần ORM không?
Không bắt buộc. Chúng tôi dùng SQLAlchemy 2.0 async với Alembic cho migration, nhưng bạn có thể viết SQL thuần. ORM không đi kèm sẵn, nên bạn chọn theo từng dự án.
Làm sao mở rộng một backend FastAPI?
Theo chiều ngang: chạy nhiều tiến trình Uvicorn dưới Gunicorn phía sau bộ cân bằng tải, với cache Redis và các tác vụ nặng chuyển sang Celery. Thiết kế stateless cho phép thêm instance khi cần.