Giới thiệu chung
GraphQL là một ngôn ngữ truy vấn dữ liệu cho API (a query language for APIs) cho phép lập trình viên yêu cầu chính xác dữ liệu mà họ cần từ phía server. Không giống như REST API truyền thống, trong đó mỗi tài nguyên thường có một endpoint riêng, GraphQL cho phép định nghĩa các truy vấn tùy chỉnh để truy xuất dữ liệu từ nhiều nguồn khác nhau chỉ bằng 1 request. Điều này giúp giảm thiểu lưu lượng mạng và tối ưu hóa việc lấy dữ liệu, đồng thời cung cấp khả năng linh hoạt cao cho các ứng dụng cần phải làm việc với nhiều loại dữ liệu khác nhau.
AWS AppSync là một dịch vụ quản lý bởi Amazon Web Services (AWS). Với AWS AppSync, bạn có thể dễ dàng xây dựng các API GraphQL mà không cần quản lý cơ sở hạ tầng phức tạp. Dịch vụ này cung cấp khả năng kết nối với nhiều nguồn dữ liệu khác nhau như Amazon DynamoDB, AWS Lambda, Amazon OpenSearch và nhiều dịch vụ AWS khác. Điều này giúp bạn tập trung vào việc phát triển chức năng của ứng dụng mà không phải lo lắng về việc quản lý cơ sở hạ tầng.
Trong phạm vi bài viết này, ta sẽ đi không đi sâu vào giải thích các khái niệm về GraphQL mà sẽ tìm hiểu về cách AWS AppSync hỗ trợ trong việc xây dựng GraphQL API.
Kiến trúc tổng quan của Appsync
Schema
Là phần quan trọng định nghĩa cấu trúc của API GraphQL, xác định các types, queries, mutations và subscriptions mà ứng dụng hỗ trợ
Resolvers
Là các hàm hoặc logic xử lý query và mutation từ client. Resolver hoạt động như cầu nối giữa schema và nguồn dữ liệu thực tế, cho phép bạn kiểm soát cách dữ liệu được truy vấn và trả về. Khi một query GraphQL được gửi từ client đến AWS AppSync, resolver tương ứng với query được kích hoạt.
Resolver đọc thông tin từ truy vấn (loại truy vấn, đối tượng, tham số), sử dụng thông tin này để xác định cách truy xuất dữ liệu từ nguồn dữ liệu cụ thể (DynamoDB, Lambda, Opensearch, …) Sau khi dữ liệu được truy xuất, resolver sẽ xử lý nó, thực hiện bất kỳ biến đổi hoặc xử lý nào cần thiết, sau đó trả về dữ liệu cho client theo định dạng mà đã được định nghĩa trong schema.
Có 2 loại resolver:
- Unit resolver: là các thực thể độc lập chỉ bao gồm request template và response template. Thường được sử dụng cho các thao tác đơn giản, chẳng hạn như liệt kê các item từ một datasource.
- Request template: Chuyển request ở cấu trúc GraphQL operations thành config mà datasource hiểu được
- Response template: Chuyển response từ datasource và format output của GraphQL
- Pipeline resolver: chứa một hoặc nhiều functions được thực hiện theo thứ tự tuần tự. Mỗi function bao gồm một request template và một response template. Ngoài ra, pipeline resolver còn có có before template và after template. After template ánh xạ tới type của GraphQL output.
- Các hàm của pipeline resolver cho phép ta viết logic chung để tái sử dụng trên nhiều resolver thành phần. Các hàm được liên kết trực tiếp với một datasource và cũng chứa request template và response template giống với 1 unit resolver
Data Sources
Là các nguồn dữ liệu mà AppSync có thể truy vấn. Datasource có thể là Amazon DynamoDB, AWS Lambda, Amazon Elasticsearch, HTTP endpoints, và nhiều dịch vụ AWS khác. Mỗi data source cung cấp các tương tác cụ thể với nguồn dữ liệu liên quan.
Ưu điểm của AppSync
- Serverless: AWS AppSync là một dịch vụ serverless, điều này giúp bạn tập trung vào việc phát triển chức năng của ứng dụng mà không cần lo lắng về việc quản lý server. Dịch vụ sẽ tự động mở rộng theo nhu cầu của ứng dụng, đảm bảo hiệu suất tốt ngay cả trong các tình huống nhiều request.
- GraphQL Schema và Resolvers: AppSync cho phép định nghĩa schema GraphQL và Resolvers một cách dễ dàng, giúp bạn kiểm soát cách dữ liệu được truy vấn và thay đổi.
- Tích Hợp Dịch Vụ AWS: AppSync tích hợp dễ dàng với các dịch vụ khác của AWS như Amazon DynamoDB, AWS Lambda, Amazon Elasticsearch và nhiều dịch vụ khác. Điều này cho phép bạn tận dụng các dịch vụ khác để xây dựng ứng dụng phức tạp.
- Bảo Mật và Quản Lý Quyền Truy Cập: AppSync hỗ trợ nhiều cơ chế bảo mật: API key, IAM, OpenID Connect, Lambda, Cognito.
Một vài ứng dụng đặc biệt của AppSync
Real-time subscription
Cách Real-time Subscriptions hoạt động:
- Định nghĩa Subscriptions trong Schema: Trong schema của bạn, bạn có thể định nghĩa các subscriptions cho các trường dữ liệu mà bạn muốn ứng dụng có khả năng theo dõi thay đổi. Ví dụ: bạn có thể định nghĩa một subscription để theo dõi sự thay đổi khi có message mới.
- Khi Người Dùng Đăng Ký Subscription: Khi người dùng đăng ký một subscription cụ thể, client sẽ thiết lập một kết nối thời gian thực với AWS AppSync.
- Thay Đổi Dữ Liệu: Khi có sự thay đổi xảy ra trong nguồn dữ liệu liên quan đến subscription, resolver tương ứng với subscription đó sẽ được kích hoạt.
- Gửi Dữ Liệu cho Client: Resolver sẽ xử lý sự thay đổi và gửi thông tin tới client thông qua kết nối thời gian thực đã được thiết lập.
Appsync Offline
Cách Offline Data hoạt động:
- Khi ứng dụng có kết nối mạng, các query và mutation sẽ được thực hiện bình thường và dữ liệu sẽ được đồng bộ hóa với nguồn dữ liệu chính.
- Khi ứng dụng không có kết nối mạng, các truy vấn và mutations sẽ được lưu trữ tạm thời trong bộ nhớ đệm trên thiết bị.
- Khi kết nối mạng được khôi phục, AppSync sẽ tự động đồng bộ hóa dữ liệu tạm thời với nguồn dữ liệu chính, đảm bảo rằng dữ liệu mới nhất được cập nhật.
Tổng kết
Trên đây là phần giới thiệu tổng quan về AWS AppSync. Ngoài những tính năng đã đề cập ở trên, AppSync còn rất nhiều ứng dụng nâng cao khác. Nếu như muốn tìm hiểu thêm về Appsync, các bạn có thể tham khảo thêm các đường link sau.
- https://aws.amazon.com/appsync/
- https://docs.aws.amazon.com/appsync/latest/devguide/what-is-appsync.html
Hy vọng bài viết này sẽ giúp ích với các bạn đang có ý định xây dựng hệ thống sử dụng GraphQL và AWS AppSync.