Họ đang đo gì
Bạn chọn theo ràng buộc hay theo thứ đang thịnh hành.
Trả lời ngắn~30 giây
Mình hỏi ba câu trước: client là ai, hình dạng dữ liệu ra sao, và ai vận hành nó. gRPC cho giao tiếp giữa các dịch vụ nội bộ — nhanh, hợp đồng chặt, sinh code sẵn, nhưng khó gọi từ trình duyệt và khó debug bằng curl. GraphQL khi có nhiều client với nhu cầu dữ liệu khác nhau và bạn muốn tránh chục endpoint tuỳ biến. REST cho API công khai, vì nó dễ hiểu nhất, cache tốt nhất và ai cũng gọi được.
Giải thích sâu
Điểm mạnh thật của gRPC không phải tốc độ mà là HỢP ĐỒNG. File .proto là một nguồn sự thật sinh ra client và server ở nhiều ngôn ngữ, nên cả một lớp lỗi “tên trường không khớp” biến mất khỏi hệ thống. Tốc độ nhờ HTTP/2 và protobuf là phần thưởng thêm, và thường không phải lý do quyết định — trừ khi bạn thật sự đo và thấy chi phí tuần tự hoá đáng kể.
GraphQL đổi một tập vấn đề lấy một tập khác. Bạn hết cảnh over-fetching và hết những endpoint kiểu /users/:id/with-orders-and-address, nhưng bạn nhận về: cache HTTP gần như vô dụng vì mọi thứ là POST cùng URL, giới hạn tần suất khó vì một query có thể nặng gấp trăm lần query khác, và N+1 xuất hiện tự nhiên trong resolver. Nếu đội không sẵn sàng dựng DataLoader và phân tích độ phức tạp truy vấn thì chi phí này đến rất sớm.
Một lựa chọn hay bị bỏ quên: REST bình thường cộng vài endpoint tổng hợp cho đúng những màn hình cần. Nó xấu về mặt lý thuyết và tốt về mặt vận hành — cache được, đo được, giới hạn tần suất được, và ai mới vào đội cũng hiểu ngay. Nói được rằng lựa chọn nhàm chán vẫn có thể là lựa chọn đúng là một tín hiệu tốt ở vòng senior.
Câu hỏi tiếp theo họ sẽ hỏi
?gRPC từ trình duyệt thì sao?
Cần gRPC-Web cộng một proxy (Envoy hoặc tương đương) vì trình duyệt không cho kiểm soát đủ mức HTTP/2 mà gRPC cần. Đó là một thành phần hạ tầng nữa, và thường là lý do người ta chọn REST cho tầng ngoài dù bên trong dùng gRPC.
Trả lời thế này là mất điểm
- Chọn GraphQL cho một dịch vụ có đúng một client. Bạn trả toàn bộ chi phí mà không dùng tới lợi ích chính.