- Sau 6 năm sử dụng từ 2018, tôi từng là một fan cuồng GraphQL thực thụ, nhưng giờ đã bắt đầu hoài nghi
- Tôi muốn giải thích vì sao giờ đây mình không còn khuyến nghị GraphQL nữa và đâu là giải pháp thay thế tốt hơn theo quan điểm của tôi
Bề mặt tấn công
- GraphQL làm tăng rủi ro mở rộng bề mặt tấn công khi phơi bày một ngôn ngữ truy vấn.
- Các vấn đề liên quan đến phân quyền đặc biệt quan trọng.
- Cần kiểm tra phân quyền phù hợp cho mọi trường.
- Với REST API, việc kiểm tra quyền theo từng endpoint đơn giản hơn.
Phân quyền
- Cần xác minh quyền người dùng cho mọi trường.
- Với REST API, việc kiểm tra quyền theo từng endpoint đơn giản hơn.
Giới hạn tốc độ
- Truy vấn GraphQL không có giới hạn kích thước nên có thể gây tải lớn cho máy chủ.
- Có thể ước tính độ phức tạp của truy vấn và giới hạn những truy vấn vượt quá một mức độ phức tạp nhất định.
- Với REST API, việc giới hạn số lượng request đơn giản hơn.
Phân tích truy vấn
- Chuỗi truy vấn sai có thể khiến máy chủ sử dụng bộ nhớ quá mức.
- Có thể đặt số lượng lỗi tối đa để dừng quá trình phân tích.
Hiệu năng
Lấy dữ liệu và vấn đề N+1
- Field resolver có thể gọi nguồn dữ liệu bên ngoài nhiều lần.
- Có thể dùng mẫu Dataloader để giải quyết vấn đề này.
- Với REST, việc xử lý vấn đề N+1 trong controller đơn giản hơn.
Phân quyền và vấn đề N+1
- Mã phân quyền có thể gây ra vấn đề N+1.
- Với REST, vấn đề này không xảy ra.
Sự gắn kết
- Codebase GraphQL có business logic gắn chặt với tầng truyền tải.
- Cần kiểm thử tích hợp và việc debug cũng khó khăn hơn.
Độ phức tạp
- Nhiều phương pháp khác nhau để xử lý các vấn đề bảo mật và hiệu năng của GraphQL làm tăng độ phức tạp của codebase.
- Các giải pháp REST nhìn chung đơn giản hơn.
Giải pháp thay thế
- Tác giả khuyến nghị JSON REST API sử dụng OpenAPI 3.0+.
- Nếu có client được viết bằng ngôn ngữ kiểu tĩnh, OpenAPI có thể là lựa chọn tốt hơn.
- OpenAPI có thể tự động sinh mã client an toàn kiểu dữ liệu.
Ý kiến của GN⁺
- GraphQL rất mạnh, nhưng cần nhiều nỗ lực để giải quyết các vấn đề về bảo mật và hiệu năng.
- REST API tương đối đơn giản và trong nhiều trường hợp có thể phù hợp hơn.
- OpenAPI cung cấp type safety và các công cụ tự động hóa, giúp nâng cao năng suất phát triển.
- Khi áp dụng GraphQL, cần cân nhắc đầy đủ các vấn đề về bảo mật và hiệu năng.
- Điều quan trọng là phải so sánh ưu và nhược điểm của REST và GraphQL để chọn công nghệ phù hợp với dự án.
8 bình luận
Lý do tôi từ bỏ GraphQL sau 6 năm
Thời đại bùng nổ của RPC đang đến
Đúng là vậy mà... Không thể cứ thấy thứ gì đó hào nhoáng xuất hiện là vồ lấy rồi tung hô được.. Giờ đến lượt ORM rồi. Ngày của mày cũng không còn xa đâu...
ORM đã xuất hiện hơn 20 năm rồi mà...
Đến năm 2018 thì PQ cũng không còn quá mới nữa (thực ra đã được khuyến nghị ngay từ khi GraphQL lần đầu được công bố), nên khá ngạc nhiên là họ đã không thử trong suốt 6 năm...
Do tất cả những lý do đã nêu ở trên, việc tự tay triển khai toàn bộ GraphQL là khó khăn về cả độ phức tạp lẫn tính ổn định. Có lẽ sẽ tốt hơn nếu đặt một layer như hasura hoặc postgraphile lên trên DB, rồi tùy nhu cầu mà phát triển theo cách bổ sung graphql hay rest vào layer này.
Ý kiến Hacker News