GraphQL là gì ?

Kể từ khi kiến trúc Restful ra đời (2000), khi nhắc đến api chúng ta sẽ nghĩ ngay đến Restful API. Restful đã trở thành một tiêu chuẩn để xây dựng các API web. Nhưng trong thời gian gần đây, Facebook đã cho ra mắt GraphQL, một công cụ mới để xây dựng api. GraphQL sinh ra để giải quyết các thiếu sót và kém hiệu quả của Restful.

Bài viết này mình muốn giới thiệu cơ bản về GraphQL. Hi vọng sau bài viết này, các bạn sẽ có thêm một cách mới để xây dựng api cho các hệ thống.

Giới thiệu về Restful API

Thông thường, khi nhắc đến api thì chúng ta thường nghĩ đến Restful API.

Cơ chế của Restful API là chúng ta sẽ định nghĩa các entrypoint (theo các phương thức GET, POST, PUT, DELETE) để thao tác với các dữ liệu trên server.

Đặc trưng của Restful API

  • Mỗi thao tác đến hệ thống tương ứng với một entrypoint. Chúng ta cần tạo ra nhiều entrypoint khác nhau cho những truy cập khác nhau.
  • Dữ liệu trả về trên mỗi entrypoint là cố định theo định nghĩa sẵn ở server.

GraphQL là gì ?

GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.

Theo như định nghĩa trên trang chủ thì GraphQL là ngôn ngữ truy vấn cho các API, cung cấp mô tả đầy đủ và dễ hiểu về dữ liệu trong API.

Đặc trưng của GraphQL

  • Chỉ có một entrypoint duy nhất cho toàn bộ server. Khác hoàn toàn với cơ chế của Restful API.
  • Dữ liệu sẽ trả về khác nhau dựa theo câu yêu cầu truy vấn từ phía client.

Với các đặc trưng trên, GraphQL trở thành một công cụ mạnh mẽ, mềm dẻo để xây dựng api vì người phát triển không cần định nghĩa ra các api khác nhau như Restful, dữ liệu trả về cho client cũng rất linh hoạt.

Hình ảnh sau sẽ cho bạn thấy sự khác biệt giữa Restful và GraphQL.

Cơ chế hoạt động

Bình thường khi viết API theo kiểu Restful chúng ta sẽ truy cập vào từng model và thực hiện các câu query cho từng đối tượng độc lập để lấy dữ liệu ra.

GraphQL có một cách tiếp cận khác hoàn toàn với mô hình trên. Dữ liệu ở server sẽ được biểu diễn lại theo dạng graph như hình dưới. Khi lấy dữ liệu từ server, chúng ta sẽ thao tác trên các node của graph, lấy dữ liệu từ node và các node có quan hệ với node đó.

  • Mỗi node trong đồ thị là một record trong database.
  • Mỗi cạnh của đồ thị tương ứng với quan hệ giữa các record với nhau.  

Ưu điểm của GraphQL

Simple

  • Chỉ có một api duy nhất cho toàn bộ các truy cập đến server, nhanh chóng xây dựng api theo mong muốn.

Flex

  • Dữ liệu trả về cho client phụ thuộc vào cách truy vấn của người dùng, loại bỏ được các trường dữ liệu không cần thiết trong quá trình truy vấn.
  • Câu truy vấn client đơn giản, tùy ý, dễ viết và dễ hiểu.
  • GraphQL tránh được vấn đề N+1 truy vấn để lấy ra thông tin có mối quan hệ phụ thuộc phức tạp. Ví dụ như truy vấn GET /user/:id/friend/:id  trong Restful API.

Powerful

  • Chúng ta có thể bổ sung cơ chế cache lại các truy vấn đến server để giảm thiểu sự truy cập vào database, tăng hiệu suất xử lý. Các câu query giống nhau sẽ được trả về từ cache thay vì phải truy vấn lại vào database.
  • Có thể tích hợp nhiều hệ thống phía sau GraphQL, che giấu sự phức tạp của nó. Khi chuyển từ kiến trúc monolithic sang kiến trúc microservices, chúng ta có thể sử dụng GraphQL để hợp nhất các giao tiếp của microservices thành một thành phần duy nhất.

Nhược điểm của GraphQL

Tất nhiên có ưu điểm thì sẽ có nhược điểm, sau đây là một điểm bạn cần lưu ý khi sử dụng GraphQL

  • Đối với các truy vấn với các trường dữ liệu có lồng nhau và phức tạp, nó có thể làm giảm hiệu suất của hệ thống, gây ra một số vấn đề truy vấn đệ quy, lặp lại. Cần phải xây dựng cơ chế giới hạn độ sâu truy vấn, tránh đệ quy và truy vấn lặp để ngăn chặn các câu truy vấn không quả từ phía client.
  • Việc triển khai cache trên hệ thống GraphQL khó hơn so với trên Restful, tuy nhiên cũng có nhiều thư viện hỗ trợ cho việc triển khai này.
  • Khó giới hạn số lượt truy cập trên một request cụ thể nào đó, điều này triển khai trên Restful dễ dàng vì mỗi request trên Restful thuộc một api cụ thể.
  • GraphQL không theo cơ chế HTTP nên chúng ta không thể bắt lỗi ở phía client theo các mã lỗi mà HTTP cung cấp (200: success, 401: unauthorized, 500: internal server error...). Mã trả về của tất cả các query của GraphQL luôn là 200.

Khi nào nên dùng GraphQL ?

GraphQL tuy rất mạnh mẽ như thế nhưng không phải trong trường hợp nào chúng ta cũng áp dụng chúng. GraphQL chỉ phù hợp khi sử dụng với các hệ thống có số lượng các thực thể lớn (model) hay các dự án có số lượng api lớn. Các bạn có thể tham khảo thêm những ưu điểm và nhược điểm của GraphQL để quyết định có nên sử dụng nó cho dự án hay không ?

Đối với các hệ thống nhỏ thì vẫn nên sử dụng Restful hơn, vì sử dụng GraphQL thì không thể tận dụng được hết lợi thế của nó.

Một số bài viết mình recommend các bạn đọc để hiểu hơn.

Build Better Customer Experiences with GraphQL

GraphQL Advantages and Disadvantages

🙏Cám ơn các bạn đã dành thời gian đọc bài viết này, trong các bài viết tới mình sẽ hướng dẫn các bạn chi tiết hơn về GraphQL và ứng dụng nó vào một project thực tế 😉.