“Chúng ta có nên dùng GraphQL không?”
Team chia đôi ngay lập tức. Một nửa bảo xịn lắm. Nửa kia bảo REST thế là ổn rồi. Không ai giải thích được sự khác biệt mà không phải dùng đến câu “it depends.”
Bài viết này giải quyết dứt điểm.
Đây là Hướng dẫn chuyên sâu về Giao thức API. Chúng ta sẽ dùng mô hình “Thực đơn Nhà hàng” để hiểu REST (Thực đơn in sẵn), GraphQL (Gọi món tùy ý) và gRPC (Bộ đàm giữa các đầu bếp).
Phần 1: Nền tảng (Mô hình tư duy)
REST = Thực đơn In sẵn
REST API giống như nhà hàng có thực đơn in sẵn. Bếp quyết định có những món gì. Bạn chọn từ danh sách đó.
- Điểm mạnh: Đơn giản, phổ quát. Mọi ngôn ngữ, mọi công cụ (Postman, curl) đều hiểu.
- Điểm yếu: Bạn nhận đúng cái có trên thực đơn. Nếu chỉ muốn cái salad trong “Combo Gà Nướng + Salad,” bạn vẫn phải trả tiền cả combo. (Over-fetching). Hoặc thực đơn không có đúng thứ bạn cần; bồi bàn phải mang ba món riêng ra. (Under-fetching).
GraphQL = Gọi món Tùy ý
GraphQL giống như nhà hàng nơi bạn nói chính xác với đầu bếp những gì bạn muốn.
- “Cho tôi ức gà không nước sốt, thêm cơm, và sốt salad xoài.”
- Bếp làm đúng cái đó. Một chuyến bưng. Đúng những gì bạn yêu cầu.
- Điểm mạnh: Không over-fetching. Không under-fetching. Cực tốt cho mobile app nơi băng thông có hạn.
- Điểm yếu: Bếp phức tạp hơn. Phải quản lý schema. Phân quyền khó hơn (user này có được hỏi
user.creditCardkhông?).
gRPC = Bộ đàm giữa các đầu bếp
gRPC không dành cho khách hàng. Nó dành cho giao tiếp bếp-với-bếp.
- Đầu bếp Bộ phận Đồ lạnh gọi bộ đàm cho Bộ phận Đồ nóng: “Bít tết xong chưa?”
- Dùng giao thức nhị phân (không phải text có thể đọc được) để tối đa tốc độ.
- Strongly typed. Hợp đồng được định nghĩa trong file
.proto. - Điểm mạnh: Nhanh gấp bội (3x-10x JSON/REST). Hỗ trợ streaming hai chiều.
- Điểm yếu: Không dùng được trên browser. File
.protocần tooling chung.
Phần 2: Điều tra (Khác biệt kỹ thuật)
1. Vấn đề N+1 (Gót chân Achilles của REST)
Một UI hiển thị danh sách bài viết (Posts) kèm tên tác giả.
| |
GraphQL giải quyết: Một query, lấy đúng dữ liệu cần.
| |
2. gRPC: Hợp đồng Proto
File .proto là ADN của gRPC — ngôn ngữ chung mà cả client lẫn server đều hiểu.
| |
Từ một file này, protoc tự sinh ra code client và server strongly-typed cho Python, Go, Java,…
Phần 3: Chẩn đoán (Khi nào dùng gì?)
| Use Case | Lựa chọn tốt nhất | Tại sao |
|---|---|---|
| API Công khai (dev bên thứ ba) | REST | Phổ quát — ngôn ngữ nào cũng dùng được. |
| Mobile App (băng thông quan trọng) | GraphQL | Lấy đúng dữ liệu màn hình cần, không hơn không kém. |
| Microservice Nội bộ | gRPC | Nhanh, type-safe, hỗ trợ streaming. |
| Dữ liệu Realtime (chat, feed) | GraphQL Subscriptions hoặc gRPC Streaming | Streaming được tích hợp sẵn. |
| CRUD đơn giản | REST | Đừng phức tạp hóa không cần thiết. |
| BFF (Backend for Frontend) | GraphQL | Tổng hợp nhiều service cho một UI. |
Phần 4: Giải pháp (Code Examples)
1. REST (Python/Django)
| |
2. GraphQL (Python/Strawberry)
| |
3. gRPC (Python)
| |
Mô hình tư duy chốt hạ
| |
Bắt đầu với REST. Chuyển sang GraphQL chỉ khi client mobile than phiền về lượng data. Chuyển sang gRPC khi latency của service nội bộ trở thành nút cổ chai.
