𝗥𝗘𝗦𝗧 𝘃𝘀 𝗚𝗿𝗮𝗽𝗵𝗤𝗟 𝘃𝘀 𝘁𝗥𝗣𝗖 𝗻𝗮̆𝗺 𝟮𝟬𝟮𝟲
Mọi dự án mới đều bắt đầu với cùng một cuộc tranh luận.
"Hãy dùng REST vì ai cũng biết nó."
Cuộc tranh luận này diễn ra trong mọi buổi họp về kiến trúc. Vào năm 2026, chúng ta đã có đủ dữ liệu để kết thúc cuộc thảo luận này. Không có người chiến thắng duy nhất. Chỉ có câu trả lời đúng cho dự án cụ thể của bạn.
Dưới đây là bảng phân tích chi tiết:
REST
- Tốt nhất cho: Public API
- Độ khó khi học: Thấp
- An toàn kiểu (Type safety): Thủ công
- Bộ nhớ đệm (Caching): Tuyệt vời
- Hỗ trợ: Mọi ngôn ngữ
GraphQL
- Tốt nhất cho: Dữ liệu phức tạp và nhiều client
- Độ khó khi học: Cao
- An toàn kiểu (Type safety): Được tạo tự động
- Bộ nhớ đệm (Caching): Khó
- Hỗ trợ: Mọi ngôn ngữ
tRPC
- Tốt nhất cho: TypeScript full-stack
- Độ khó khi học: Trung bình
- An toàn kiểu (Type safety): Có sẵn
- Bộ nhớ đệm (Caching): Tốt
- Hỗ trợ: Chỉ TypeScript
REST vẫn đang vận hành 80% các Public API. Nó hoạt động hiệu quả vì ngôn ngữ nào cũng có HTTP client. Nó hoạt động hiệu quả vì việc caching qua CDN rất dễ dàng. Chi phí ẩn chính là việc quản lý phiên bản (versioning). Bạn sẽ mất nhiều năm để duy trì /v1 song song với /v2.
Hãy dùng REST cho Public API, tích hợp bên thứ ba hoặc webhooks.
GraphQL giải quyết vấn đề over-fetching (lấy thừa dữ liệu). Nó cho phép client yêu cầu chính xác những gì họ cần. Điều này có thể giảm độ trễ (latency) tới 28% đối với các truy vấn phức tạp. Cái giá phải trả là chi phí vận hành (operational overhead). Bạn cần các công cụ để quản lý độ phức tạp và độ sâu của truy vấn.
Hãy dùng GraphQL khi bạn có một đồ thị dữ liệu phức tạp và nhiều loại client với các nhu cầu dữ liệu khác nhau.
tRPC mang lại trải nghiệm lập trình viên (developer experience) tốt nhất cho người dùng TypeScript. Bạn có được khả năng suy luận kiểu (type inference) đầy đủ mà không cần schema hay code generation. Nếu bạn đổi tên một hàm ở server, IDE sẽ hiển thị ngay lập tức mọi client bị lỗi. Giới hạn rất rõ ràng: nó chỉ hoạt động nếu client và server của bạn dùng chung một codebase TypeScript.
Hãy dùng tRPC khi toàn bộ stack của bạn là TypeScript và bạn sử dụng monorepo.
Hầu hết các hệ thống thành công đều sử dụng nhiều hơn một loại.
- Public API: REST
- Frontend của riêng bạn: tRPC hoặc GraphQL
- Microservices nội bộ: REST
Hãy chọn công cụ của bạn bằng cách trả lời ba câu hỏi sau:
- Ai là người sử dụng API?
- Đối tác bên ngoài: REST
- Frontend TypeScript của chính bạn: tRPC
- Nhiều loại client khác nhau: GraphQL
- Bạn có kiểm soát được tất cả các client không?
- Có (tất cả đều là TypeScript): tRPC
- Không: REST hoặc GraphQL
- Dữ liệu phức tạp đến mức nào?
- CRUD đơn giản: REST hoặc tRPC
- Quan hệ sâu (Deeply relational): GraphQL
Đừng chọn dựa trên xu hướng. Hãy chọn dựa trên người dùng của bạn.
Source: https://dev.to/respect17/rest-vs-graphql-vs-trpc-in-2026-52dm