Xây dựng các ứng dụng thời gian thực với Amazon EventBridge và AWS AppSync

của James Beswick | ngày 31 tháng 1, 2024 12:02 AM| trong Amazon EventBridge , AWS AppSync , Serverless | Liên kết cố địnhChia sẻ

Bài đăng này được viết bởi Josh Kahn, Trưởng nhóm công nghệ, Serverless.

Amazon EventBridge hiện hỗ trợ xuất bản các sự kiện lên AWS AppSync API GraphQL dưới dạng mục tiêu gốc. Việc tích hợp mới cho phép các nhà xây dựng dễ dàng xuất bản các sự kiện tới nhiều đối tượng người tiêu dùng hơn và đơn giản hóa việc cập nhật cho khách hàng với dữ liệu gần như thời gian thực. Bạn có thể sử dụng EventBridge và AWS AppSync để xây dựng kiến trúc hướng sự kiện linh hoạt, dựa trên đăng ký cho người tiêu dùng.

Để minh họa việc sử dụng EventBridge với AWS AppSync, hãy xem xét một kịch bản vận hành sân bay được đơn giản hóa. Trong ví dụ này, các hãng hàng không xuất bản các sự kiện chuyến bay (ví dụ: lên máy bay, lùi chuyến, thay đổi cổng và chậm trễ) cho một dịch vụ duy trì trạng thái chuyến bay trên màn hình trong sân bay. Các hãng hàng không cũng xuất bản các sự kiện hữu ích cho các đơn vị khác tại sân bay, chẳng hạn như người xử lý hành lý và bảo trì, nhưng không hữu ích cho hành khách. Điều này mô tả một cái nhìn khái niệm về hệ thống:

Hành khách muốn màn hình trong sân bay được cập nhật và chính xác. Có một số cách để thiết kế ứng dụng hiển thị sao cho dữ liệu luôn được cập nhật. Nhìn rộng ra, chúng bao gồm ứng dụng thăm dò một số API hoặc ứng dụng đăng ký thay đổi dữ liệu.

Đăng ký cho trường hợp này sẽ tốt hơn vì những thay đổi về dữ liệu là nhỏ và tăng dần so với lượng thông tin lớn được hiển thị. Ví dụ: trong trường hợp bị trễ, màn hình sẽ cập nhật trạng thái và thời gian khởi hành nhưng không có thông tin chi tiết nào khác về một chuyến bay trong danh sách thông tin chuyến bay lớn hơn.

AWS AppSync có thể cho phép khách hàng lắng nghe các thay đổi dữ liệu theo thời gian thực thông qua việc sử dụng đăng ký GraphQL. Chúng được triển khai bằng cách sử dụng kết nối WebSocket giữa máy khách và dịch vụ AWS AppSync. Máy khách ứng dụng hiển thị gọi hoạt động đăng ký GraphQL để thiết lập kết nối an toàn. AWS AppSync sẽ tự động đẩy các thay đổi (hoặc đột biến) dữ liệu thông qua API GraphQL tới những người đăng ký sử dụng kết nối đó.

Trước đây, các nhà xây dựng có thể sử dụng API Destinations EventBridge để kết nối các sự kiện được xuất bản và định tuyến thông qua EventBridge tới AWS AppSync, như được mô tả trong bài đăng blog trước đó và có sẵn trong các mẫu Serverless Land ( API Key , OAuth ). Cách tiếp cận này rất hữu ích khi xử lý các bản cập nhật “ngoài băng tần” trong đó dữ liệu thay đổi bên ngoài đột biến AWS AppSync. Các bản cập nhật ngoài băng tần thường yêu cầu nguồn dữ liệu NONE trong AWS AppSync để thông báo cho người đăng ký về các thay đổi, như được mô tả trong  AWS re:Post Knowledge Center . Việc bổ sung AWS AppSync làm mục tiêu cho EventBridge sẽ đơn giản hóa các trường hợp sử dụng này vì giờ đây bạn có thể kích hoạt đột biến để phản hồi một sự kiện mà không cần mã bổ sung.

Airport Operations Events

Mở rộng kịch bản, các sự kiện vận hành sân bay trông như thế này:

JSON

{  “flightNum”: 123,  “carrierCode”: “JK”,  “date”: “2024-01-25”,  “event”: “FlightDelayed”,  “message”: “Delayed 15 minutes, late aircraft”,  “info”: “{ \\”newDepTime\\”: \\”2024-01-25T13:15:00Z\\”, \\”delayMinutes\\”: 15 }”}

Trường sự kiện xác định loại sự kiện và liệu nó có liên quan đến hành khách hay không. Chi tiết sự kiện cung cấp thêm thông tin về sự kiện, thông tin này thay đổi tùy theo loại sự kiện. Sân bay xuất bản nhiều sự kiện khác nhau nhưng màn hình sân bay chỉ cần một tập hợp con của những thay đổi đó.

AWS AppSyncAPI GraphQL bắt đầu bằng lược đồ GraphQL xác định loại, trường và thao tác có sẵn trong API đó. AWS AppSync documentation cung cấp thông tin tổng quan về lược đồ và các thông tin cơ bản khác về GraphQL. Lược đồ GraphQL một phần cho kịch bản sân bay như sau:

GraphQL

type DelayEventInfo implements EventInfo { message: String delayMinutes: Int newDepTime: AWSDateTime}interface EventInfo { message: String}enum StatusEvent { FlightArrived FlightBoarding FlightCancelled FlightDelayed FlightGateChanged FlightLanded FlightPushBack FlightTookOff}type StatusUpdate { num: Int! carrier: String! date: AWSDate! event: StatusEvent! info: EventInfo}input StatusUpdateInput { num: Int! carrier: String! date: AWSDate! event: StatusEvent! message: String extra: AWSJSON}type Mutation { updateFlightStatus(input: StatusUpdateInput!): StatusUpdate!}type Query { listStatusUpdates(by: String): [StatusUpdate]}type Subscription { onFlightStatusUpdate(date: AWSDate, carrier: String): StatusUpdate @aws_subscribe(mutations: [“updateFlightStatus”])}schema { query: Query mutation: Mutation subscription: Subscription}

Kết nối EventBridge với AWS AppSync

EventBridge cho phép bạn lọc, chuyển đổi và định tuyến các sự kiện tới một số mục tiêu. Dịch vụ trưng bày sân bay chỉ cần những sự kiện tác động trực tiếp đến hành khách. Bạn có thể xác định quy tắc trong EventBridge chỉ định tuyến những sự kiện đó (có trong lược đồ GraphQL trước đó) tới mục tiêu AWS AppSync. Các sự kiện khác được định tuyến ở nơi khác, như được xác định bởi các quy tắc khác hoặc bị loại bỏ. Bạn có thể tìm thấy thông tin chi tiết về cách tạo quy tắc EventBridge và định dạng mẫu khớp sự kiện trong tài liệu EventBridge .

Sự kiện bị trì hoãn chuyến bay trước đó sẽ được phân phối bằng EventBridge như sau:

JSON

{  “id”: “b051312994104931b0980d1ad1c5340f”,  “detail-type”: “Operations: Flight delayed”,  “source”: “airport-operations”,  “time”: “2024-01-25T16:58:37Z”,  “detail”: {    “flightNum”: 123,    “carrierCode”: “JK”,    “date”: “2024-01-25”,    “event”: “FlightDelayed”,    “message”: “Delayed 15 minutes, late aircraft”,    “info”: “{ \\”newDepTime\\”: \\”2024-01-25T13:15:00Z\\”, \\”delayMinutes\\”: 15 }”  }}

Trong trường hợp này, có một danh sách cụ thể các sự kiện quan tâm, nhưng EventBridge cung cấp một tập hợp thao tác linh hoạt để khớp các mẫu, kiểm tra mảng và lọc theo nội dung bằng cách sử dụng tiền tố, số hoặc cách khớp khác. Một số tổ chức cũng sẽ cho phép người đăng ký xác định quy tắc riêng của họ trên xe buýt sự kiện EventBridge, cho phép mục tiêu đăng ký sự kiện thông qua dịch vụ tự phục vụ.

Mẫu sự kiện sau khớp với các sự kiện cần thiết cho dịch vụ hiển thị sân bay:

JSON

{  “source”: [ “airport-operations” ],  “detail”: {    “event”: [ “FlightArrived”, “FlightBoarding”, “FlightCancelled”, … ]  }}

Để tạo quy tắc EventBridge mới, bạn có thể sử dụng Bảng điều khiển quản lý AWS hoặc cơ sở hạ tầng làm mã. Bạn có thể tìm thấy định nghĩa CloudFormation cho quy tắc đã hoàn thành với mục tiêu AWS AppSync ở phần sau của bài đăng này.

Tạo AWS AppSync target

Giờ đây, EventBridge đã được định cấu hình để định tuyến các sự kiện đã chọn, hãy xác định AWS AppSync làm mục tiêu cho quy tắc. API AWS AppSync phải hỗ trợ ủy quyền IAM để được sử dụng làm mục tiêu EventBridge. AWS AppSync hỗ trợ nhiều loại ủy quyền trên một loại GraphQL duy nhất, do đó, bạn cũng có thể sử dụng OpenID Connect, Nhóm người dùng Amazon Cognito hoặc các phương thức ủy quyền khác nếu cần.

Để định cấu hình AWS AppSync làm mục tiêu EventBridge, hãy xác định mục tiêu bằng AWS Management Console hoặc infrastructure as code. Trong bảng điều khiển, chọn LTarget Type là “AWS Service” và Target as “AppSync”. Chọn API của bạn. EventBridge phân tích cú pháp lược đồ GraphQL và cho phép bạn chọn đột biến để gọi khi quy tắc được kích hoạt.

Khi sử dụng Bảng điều khiển quản lý AWS, EventBridge cũng sẽ đặt cấu hình vai trò AWS IAM cần thiết để gọi đột biến đã chọn. Hãy nhớ tạo và liên kết vai trò với chính sách tin cậy phù hợp khi định cấu hình bằng IaC.

EventBridge hỗ trợ chuyển đổi đầu vào để tùy chỉnh nội dung của sự kiện trước khi chuyển thông tin làm đầu vào đến mục tiêu. Định cấu hình biến áp đầu vào để trích xuất các giá trị cần thiết từ sự kiện bằng cách sử dụng đường dẫn JSON và mẫu ở định dạng đầu vào mà API AWS AppSync mong đợi. EventBridge cung cấp một tiện ích tiện dụng trong Bảng điều khiển để vượt qua và kiểm tra kết quả của một sự kiện mẫu.

Cuối cùng, định cấu hình bộ lựa chọn để bao gồm phản hồi từ API AWS AppSync. Đây là các trường sẽ được trả về EventBridge khi thực hiện đột biến. Mặc dù kết quả trả về EventBridge không quá hữu ích (ngoài việc khắc phục sự cố), nhóm lựa chọn đột biến cũng sẽ xác định các trường có sẵn cho người đăng ký đăng ký onFlightStatusUpdate.

Xác định quy tắc EventBridge tới AWS AppSync trong CloudFormation

Infrastructure as code templates, bao gồm AWS CloudFormationAWS CDK , rất hữu ích trong việc mã hóa các định nghĩa cơ sở hạ tầng để triển khai trên các Regions và accounts. Mặc dù bạn có thể viết CloudFormation bằng tay nhưng EventBridge cung cấp tính năng xuất CloudFormation hữu ích trong AWS Management Console. Bạn có thể sử dụng tính năng này để xuất định nghĩa cho quy tắc đã xác định.

Đây là CloudFormation cho quy tắc đã cấu hình trước đó và mục tiêu AWS AppSync. Đoạn mã này bao gồm cả định nghĩa quy tắc và cấu hình mục tiêu.

YAML

PassengerEventsToDisplayServiceRule:    Type: AWS::Events::Rule    Properties:      Description: Route passenger related events to the display service endpoint      EventBusName: eb-to-appsync      EventPattern:        source:          – airport-operations        detail:          event:            – FlightArrived            – FlightBoarding            – FlightCancelled            – FlightDelayed            – FlightGateChanged            – FlightLanded            – FlightPushBack            – FlightTookOff      Name: passenger-events-to-display-service      State: ENABLED      Targets:        – Id: 12344535353263463          Arn: <AppSync API GraphQL API ARN>          RoleArn: <EventBridge Role ARN (defined elsewhere)>          InputTransformer:            InputPathsMap:              carrier: $.detail.carrierCode              date: $.detail.date              event: $.detail.event              extra: $.detail.info              message: $.detail.message              num: $.detail.flightNum            InputTemplate: |-              {                “input”: {                  “num”: <num>,                  “carrier”: <carrier>,                  “date”: <date>,                  “event”: <event>,                  “message”: “<message>”,                  “extra”: <extra>                }              }          AppSyncParameters:            GraphQLOperation: >-              mutation              UpdateFlightStatus($input:StatusUpdateInput!){updateFlightStatus(input:$input){                event                date                carrier                num                info {                  __typename… on DelayEventInfo {                    message                    delayMinutes                    newDepTime}                }              }}

ARN của API AWS AppSync có dạng arn:aws:appsync:<AWS_REGION>:<ACCOUNT_ID>:endpoints/graphql-api/<GRAPHQL_ENDPOINT_ID>. 

ARN có sẵn trong CloudFormation (xem giá trị trả về của GraphQLEndpointArn ) hoặc có thể được tạo bằng cách sử dụng mã định danh có trong điểm cuối GraphQL AWS AppSync. ARN có trong chính sách vai trò thực thi EventBridge là ARN API AWS AppSync (một ARN khác).

Trường AppSyncParameters bao gồm thao tác GraphQL để EventBridge gọi ra trên API AWS AppSync. Điều này phải được định dạng tốt và phù hợp với lược đồ GraphQL. Bao gồm bất kỳ trường nào phải có sẵn cho người đăng ký trong bộ lựa chọn.

Testing subscriptions

AWS AppSync hiện được đặt cấu hình làm mục tiêu cho quy tắc EventBridge. Ứng dụng hiển thị trong đời thực sẽ sử dụng thư viện GraphQL, chẳng hạn như AWS Amplify , để đăng ký các thay đổi dữ liệu theo thời gian thực. Bảng điều khiển quản lý AWS cung cấp tiện ích hữu ích để kiểm tra. Điều hướng đến [bảng điều khiển AWS AppSync](https://console.aws.amazon.com/appsync/home?) và chọn Truy vấn trong menu cho API của bạn. Nhập truy vấn sau và chọn Run để đăng ký thay đổi dữ liệu:

GraphQL

subscription MySubscription {  onFlightStatusUpdate {    carrier    date    event    num    info {      __typename      … on DelayEventInfo {        message        delayMinutes        newDepTime      }    }  }}

Trong tab trình duyệt riêng, hãy điều hướng đến EventBridge console và chọn Send events . Trên trang Gửi sự kiện , chọn xe buýt sự kiện cần thiết và đặt nguồn Sự kiện thành “hoạt động tại sân bay”. Sau đó nhập loại chi tiết bạn chọn. Cuối cùng, dán thông tin sau làm Chi tiết sự kiện , sau đó chọn Send.

JSON

{  “id”: “b051312994104931b0980d1ad1c5340f”,  “detail-type”: “Operations: Flight delayed”,  “source”: “airport-operations”,  “time”: “2024-01-25T16:58:37Z”,  “detail”: {    “flightNum”: 123,    “carrierCode”: “JK”,    “date”: “2024-01-25”,    “event”: “FlightDelayed”,    “message”: “Delayed 15 minutes, late aircraft”,    “info”: “{ \\”newDepTime\\”: \\”2024-01-25T13:15:00Z\\”, \\”delayMinutes\\”: 15 }”  }}

Quay lại tab AWS AppSync trong trình duyệt của bạn để xem dữ liệu đã thay đổi trong khung kết quả:

Kết luận

Gọi trực tiếp các mục tiêu AWS AppSync API GraphQLtừ EventBridge sẽ đơn giản hóa và hợp lý hóa việc tích hợp giữa hai dịch vụ này, lý tưởng để thông báo cho nhiều người đăng ký về những thay đổi dữ liệu trong khối lượng công việc theo sự kiện. Bạn cũng có thể tận dụng các tính năng khác có sẵn từ hai dịch vụ. Ví dụ: sử dụng tính năng lọc đăng ký nâng cao AWS AppSync để chỉ cập nhật màn hình sân bay tại nhà ga nơi chúng được đặt.

Để tìm hiểu thêm về serverless, hãy truy cập Serverless Land để biết nhiều mẫu, hướng dẫn và tài liệu học tập có thể tái sử dụng. Mẫu mới được thêm vào thư viện mẫu là mẫu EventBridge sang AWS AppSync tương tự như mẫu được mô tả trong bài đăng này. Hãy xem tài liệu của EventBridge để biết thêm chi tiết.Để biết thêm tài nguyên học tập không có máy chủ, hãy truy cập Serverless Land .