Litestar: Làn gió mới thay thế FastAPI cho REST API hiệu năng cao

Python tutorial - IT technology blog
Python tutorial - IT technology blog

Vấn đề: Tại sao phải tìm phương án thay thế FastAPI?

FastAPI từ lâu đã là lựa chọn “quốc dân” khi anh em cần build REST API bằng Python. Bản thân mình cũng từng dùng nó cho mọi thứ, từ script automation nhỏ đến hệ thống monitoring lớn. Tuy nhiên, khi dự án phình to lên hàng chục nghìn dòng code, mình bắt đầu vấp phải những phiền toái khó chịu. Dependency Injection (DI) trở nên rối rắm, việc quản lý schema dữ liệu (DTO) tốn quá nhiều boilerplate code, và hiệu năng đôi khi chạm ngưỡng giới hạn khi xử lý JSON lớn.

Đó là lúc mình bén duyên với Litestar (trước đây là Starlite). Nó không chỉ nhanh hơn trên các bản benchmark mà còn cung cấp một bộ khung cực kỳ chặt chẽ. Litestar không thay đổi hoàn toàn cách bạn viết Python. Nó chỉ đơn giản là làm cho code trở nên chuyên nghiệp, dễ bảo trì và nhất quán hơn hẳn.

Quick Start: Chạy API đầu tiên trong 5 phút

Không cần lý thuyết suông, chúng ta hãy bắt tay vào cài đặt để thấy sự khác biệt ngay lập tức.

1. Cài đặt

Mở terminal và cài đặt phiên bản tiêu chuẩn của Litestar:

pip install litestar[standard]

2. Viết code

Tạo file app.py với vài dòng code cơ bản sau:

from litestar import Litestar, get

@get("/")
async def hello_world() -> dict[str, str]:
    return {"message": "Chào mừng bạn đến với Litestar!"}

@get("/greet/{name:str}")
async def greet(name: str) -> dict[str, str]:
    return {"message": f"Xin chào {name}, chúc bạn học tốt!"}

app = Litestar(route_handlers=[hello_world, greet])

3. Khởi chạy ứng dụng

Sử dụng CLI tích hợp sẵn để chạy server:

litestar run --reload

Truy cập http://127.0.0.1:8000/greet/Engineer và bạn sẽ thấy kết quả ngay. Điểm cộng lớn là Litestar tự động chuẩn bị sẵn tài liệu Swagger UI tại đường dẫn /schema/swagger. Bạn không cần cấu hình thêm bất kỳ dòng code nào để có bộ tài liệu API chuyên nghiệp.

Tại sao Litestar lại vượt trội hơn trong thực tế?

Nhiều bạn sẽ thắc mắc: “Cú pháp trông cũng giống FastAPI, vậy điểm khác biệt nằm ở đâu?”. Câu trả lời nằm ở kiến trúc bên dưới.

Quản lý bằng Class-based Controllers

Trong các dự án lớn, việc lạm dụng decorator @get hay @post ở khắp nơi sẽ biến file main thành một mớ hỗn độn. Litestar giải quyết việc này bằng Controller. Cách tiếp cận này giúp nhóm các logic liên quan lại một chỗ một cách khoa học.

from litestar import Controller, get, post

class UserController(Controller):
    path = "/users"

    @get()
    async def list_users(self) -> list[dict]:
        return [{"id": 1, "name": "Admin"}]

    @post()
    async def create_user(self, data: dict) -> dict:
        return data

app = Litestar(route_handlers=[UserController])

Khi mình làm các tool automation, việc tách biệt Controller cho server, log và user giúp code sạch sẽ hơn hẳn. Bạn sẽ không còn phải hoa mắt tìm kiếm giữa hàng trăm endpoint nữa.

DTO (Data Transfer Objects) – Vũ khí tối thượng

Đây là tính năng mình thích nhất. Thông thường, bạn phải tạo hàng tá Model Pydantic để lọc dữ liệu đầu vào và đầu ra. Với Litestar DTO, bạn có thể tự động tạo schema từ SQLAlchemy models mà không cần viết lại từng field.

Nó giúp tách bạch hoàn toàn lớp Database và lớp API Response. Bạn sẽ không bao giờ lo lắng về việc vô tình để lộ những thông tin nhạy cảm như hashed_password ra ngoài API nữa.

Tối ưu hiệu năng: Nhanh hơn nhờ msgspec

Litestar không chỉ nhanh nhờ framework mà còn nhờ thư viện serialize. Theo các bài test, việc sử dụng msgspec mặc định giúp Litestar xử lý JSON nhanh hơn gấp 2 đến 5 lần so với Pydantic v1 truyền thống. Điều này cực kỳ quan trọng khi hệ thống của bạn phải gánh hàng nghìn request mỗi giây.

Dependency Injection (DI) phân tầng

DI trong Litestar linh hoạt hơn FastAPI rất nhiều. Bạn có thể định nghĩa dependency ở cấp App, Router hoặc từng Controller riêng lẻ.

from litestar import Litestar, get, Provide

def get_db_connection() -> str:
    return "DB Connected"

@get("/status", dependencies={"db": Provide(get_db_connection)})
async def check_status(db: str) -> dict:
    return {"status": db}

app = Litestar(route_handlers=[check_status])

Cấu trúc này giúp việc viết Unit Test trở nên cực kỳ dễ dàng. Bạn chỉ cần mock dữ liệu ở cấp độ cao nhất mà không phải sửa từng function.

Kinh nghiệm thực tế khi triển khai

Sau khi chuyển đổi nhiều hệ thống monitoring sang Litestar, mình rút ra được vài lưu ý nhỏ:

  • Tận dụng CLI: Hãy dùng lệnh litestar routes thường xuyên. Nó giúp bạn bao quát toàn bộ endpoint trong project chỉ trong 1 giây.
  • Middleware thông minh: Nếu cần log thời gian phản hồi (response time), hãy viết một middleware ở cấp App. Nó sẽ tự động áp dụng cho mọi controller bên dưới.
  • Ưu tiên msgspec: Khi làm việc với dữ liệu lớn (Big Data), hãy dùng msgspec. Tốc độ xử lý sẽ được cải thiện rõ rệt so với cách làm cũ.
  • Cấu trúc thư mục: Hãy chia rõ controllers/, models/dtos/. Đừng bao giờ nhét tất cả vào file main.py nếu không muốn hối hận sau này.

Thực tế không có framework nào là hoàn hảo nhất cho mọi trường hợp. Tuy nhiên, nếu bạn cần sự chặt chẽ, hiệu năng thực thụ và khả năng mở rộng tốt, Litestar là cái tên rất đáng để đầu tư thời gian.

Việc chuyển từ FastAPI sang Litestar khá dễ dàng vì cú pháp tương đồng. Những lợi ích về mặt kiến trúc sẽ giúp bạn tiết kiệm hàng giờ đồng hồ debug và bảo trì sau này.

Share: