GraphQL – Cuộc cách mạng APIs?

GraphQL là gì?

GraphQL thực chất là một cú pháp mô tả cách biểu diễn dữ liệu theo một cách hoàn toàn mới. cung cấp cho các fontend/mobile app 1 cách thức dễ dàng hơn để request chính xác những gì họ cần, giúp việc phát triển API dễ dàng hơn theo thời gian.

Chúng ta lưu ý là request chính xác những gì chúng ta cần có nghĩa là chúng sẽ không cần phải lấy về những trường (field) không cần thiết nữa, điều này sẽ làm tăng tốc độ xử lý dữ liệu và giảm sự sai sót.

Ngoài ra, GraphQL làm cho việc tổng hợp dữ liệu từ nhiều nguồn dễ dàng hơn.

kể từ khi ra đời, GraphQL đã gần như thay thế hoàn toàn REST bởi sự hiệu quả, mạnh mẽ và linh hoạt hơn rất nhiều.

Ưu điểm của GraphQL – Vì sao cần sử dụng GraphQL thay vì REST API?

GraphQL có các ưu điểm sau:

1. Trả về chính xác những gì bạn gửi request

Việc này sẽ giảm thiểu công sức ở cả backend và frontend. Vì sao?

Vấn đề mà REST đang gặp phải là việc phản hồi dữ liệu của REST trả về quá nhiều hoặc là quá ít. Trong cả 2 trường hợp thì hiệu suất của ứng dụng đều bị ảnh hưởng khá nhiều.

Cùng quan tâm về case study này:

Giả sử chúng ta có product service cung cấp các API về product. Khi hiển thị trên frontend, lập trình viên frontend thường phải yêu cầu các trường (field) mà họ muốn cho backend và backend sẽ trả về json data tương ứng.

Tuy nhiên, nếu cần thêm trường dữ liệu thì backend sẽ phải thay đổi các câu lệnh query tương ứng. Điều này sẽ gây tốn chi phí về mặt thời gian, công sức và nhập nhằng giữa việc trao đổi ở cả frontend và backend (backend cần hiểu frontend và trả đúng data fontend cần). Điều này sẽ được giải quyết thông qua GraphQL, ở đó backend sẽ không cần quan tâm các trường phải trả về cho frontend nữa, Backend chỉ việc trả về hết tất cả các trường và GraphQL sẽ tự tổng hợp thành một Graph. Phía frontend chỉ cần lấy các trường tương ứng nếu có nhu cầu.

graphql

2. Trong GraphQL, cái chúng ta cần quan tâm là đối tượng chứ không phải là json data như REST API

Hướng đối tượng là một cách mô tả trực quan hơn trong các mối quan hệ trong lập trình. Dựa vào GraphQL chúng ta sẽ hiểu đối tượng chúng ta cần là gì và các đối tượng liên quan đến nó.

Ví dụ: Đối tượng hero thì có các đối tượng khác liên quan như: friends, species.

Các đối tượng sẽ được lồng vào nhau một cách trực quan và giúp chúng ta dễ truy cập. Ví dụ:

graphql2

graphql 3

Nói đơn giản hơn, đây là truy vấn hướng client, cấu trúc dữ liệu không khô cứng 1 khuôn mẫu từ server (REST API) mà thay đổi theo từng ngữ cảnh sao cho hiệu quả nhất đối với client.

3. Tổng hợp dữ liệu từ nhiều nguồn một cách dễ dàng

Thử hình dung về case study này:

case study

Giả sử chúng ta có 3 services là: Products, Product categories và product reviews được xây dựng và chạy độc lập và trên 3 endpoint khác nhau. Ngoài ra chúng ta cũng có một REST API endpoint từ một bên thứ 3 (ví dụ Url API lấy địa chỉ, lấy thông tin từ một phần mềm của đối tác).

Đối với các lập trình viên khi phát triển frontend/mobile app thì việc kết nối này sẽ cần tới 3 lần gọi endpoint URL Api khác nhau và cần phải quan tâm tới định dạng dữ liệu (format data) của từng API, sau đó chuyển về đúng định dạng đồng nhất thì mới cho ra được kết quả như trên hình.

Ngoài ra, có thể chúng ta cũng cần tổng hợp kết quả của từng API lại với nhau để cho ra kết quả cuối cùng. Ví dụ: Map các Id của từng product review với product Id để hiện thị trên fontend/mobile app.

Đây thực sự là một cực hình đối với các lập trình viên frontend và giảm năng suất code khi phải kiểm tra tính đúng đắn của từng loại dữ liệu.

Mặt khác nếu giả sử sau này chúng ta có thêm các nguồn dữ liệu khác bên ngoài thì việc tích hợp vào là cực kì tốn kém.

Tất cả những vấn đề trên sẽ được giải quyết bằng cách sử dụng GraphQL. Bởi vì GraphQL là Graph Query Language do Facebook tạo ra cung cấp giao thức chung cho phép giao tiếp giữa client và server để cập nhật và lấy dữ liệu.

Khi client yêu cầu dữ liệu lên server, cấu trúc dữ liệu trả về không khô cứng mà nó sẽ thay đổi theo ngữ cảnh tùy theo cách mà client yêu cầu cần những dữ liệu gì. Những format của dữ liệu sẽ được mô tả sẵn ở server. Vì vậy khi yêu cầu dữ liệu lên server chúng ta chỉ cần duy nhât 1 endpoint.

mo-hinh-graphql

So sánh GraphQL và RestAPI

REST API

Như chúng ta đã biết, để client và server giao tiếp được, trao đổi được với nhau, chúng ta thường dùng kỹ thuật gọi là REST API. REST hoạt động chủ yếu dựa vào giao thức HTTP. Các hoạt động cơ bản nêu trên sẽ sử dụng những phương thức HTTP riêng.

  • GET: lấy dữ liệu
  • POST: tạo mới
  • PUT: cập nhật (thay đổi)
  • DELETE: Xóa dữ liệu

Những phương thức hay hoạt động này thường được gọi là CRUD tương ứng với Create, Read, Update, Delete – Tạo, Đọc, Sửa, Xóa. Mỗi chức năng tương ứng với mỗi phương thức sẽ phải tạo 1 endpoint (kiểu như 1 đường dẫn). REST API được sử dụng rất rộng rãi và nó dường như trở thành 1 tiêu chuẩn trong việc kết nối trao đổi dữ liệu giữa client và server khi phát triển phần mềm.

Việc này nếu chúng ta có khoảng vài trăm service trở lên là một thảm hoạ

GRAPHQL

Khi chúng ta định nghĩa mô tả dữ liệu ở trên server thì các mô tả đó có liên quan với nhau (ví dụ như khóa ngoại trong các CSDL,..) tạo nên một sơ đồ các query có liên quan với nhau. Tóm lại nếu chúng ta vẽ ra các mối quan hệ đó bạn sẽ thấy nó trong giống sơ đồ graph. Vậy GraphQL làm mục đích biến sơ đồ này trực quan hơn và mang tính tổng hợp hơn để chúng ta dễ dàng sử dụng.

graph-trong-graphql

Việc tổng hợp này nếu chúng ta có hàng trăm service cũng không phải là vấn đề lớn.

GraphQL cũng chia thành 3 phần chính :

  • Query: Các câu lệnh lấy dữ liệu (tương tự method GET trong REST API)
  • Mutation: Các câu lệnh để thêm/sửa dữ liệu (tuơng tự method POST/PUT/DELETE trong REST API)
  • Subscription: Câu lệnh dùng để lắng nghe sự kiên trên server, khi dữ liệu trên server được thay đổi nó cũng thay đổi theo nhằm cung cấp dữ liệu cho client một cách realtime nhất có thể. Ở điểm này REST API không có cửa để đấu lại với GraphQL.

kien-truc-graph-ql

Các nền tảng hỗ trợ triển khai GraphQL hiện nay

Hiện có 2 nền tảng giúp chúng ta phát triển GraphQL một cách nhanh gọn.

https://www.apollographql.com/

https://hasura.io/

Share on facebook
Facebook
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận
0
Rất thích suy nghĩ của bạn, hãy bình luận.x