使用 Amazon EventBridge 和 AWS AppSync 构建实时应用程序 计算博客

使用 Amazon EventBridge 和 AWS AppSync 构建实时应用

by James Beswick 于 2024年1月30日发表在 Amazon EventBridge

永久链接 分享

本文由 Josh Kahn 撰写,技术负责人,无服务器解决方案。

魔方云加速器

关键要点

Amazon EventBridge 支持将事件直接发布到 AWS AppSync 的 GraphQL API,使得实时应用的构建更加简单。通过使用 AWS AppSync 和 EventBridge,可以创建基于订阅的事件驱动架构,提升系统的可靠性。本文中展示了如何通过一个简化的机场运营场景来使用 EventBridge 和 AWS AppSync。

Amazon EventBridge 现在支持将事件以原生目标发布到 AWS AppSync GraphQL APIs。这一新集成使得开发者可以轻松地将事件发布到更广泛的消费者,并简化了实时数据更新客户端的过程。通过 EventBridge 和 AWS AppSync,开发者可以在消费者之间构建可靠的、基于订阅的事件驱动架构。

为了说明如何使用 EventBridge 与 AWS AppSync,考虑一个简化的机场运营场景。在这个例子中,航空公司将航班事件例如登机、推离、登机口变更和延误发布到一个服务,该服务负责在机场显示航班状态。航空公司还会发布一些对机场其他主体如行李搬运工和维护人员有用的事件,但不包括乘客。这描绘了系统的概念性视图:

乘客希望机场的显示屏保持最新且准确。有多种方式来设计显示应用程序,以确保数据保持最新。大致来说,这些方式包括应用程序定期请求一些 API 或应用程序订阅数据变更。

在这个场景中,订阅更为有效,因为数据变更相对于显示的大量信息来说是小而渐进的。在延误的情况下,显示屏会更新状态和出发时间,但对于一长串航班信息中的单个航班,不会披露其他细节。

AWS AppSync 使客户端能够通过 GraphQL 订阅来监听实时数据变更。这些订阅通过客户端与 AWS AppSync 服务之间的 WebSocket 连接实现。显示应用程序客户端调用 GraphQL 订阅操作以建立安全连接。AWS AppSync 会通过 GraphQL API 自动将数据变更或突变推送给使用该连接的订阅者。

之前,开发者可以使用 EventBridge API 目标 来将通过 EventBridge 发布和路由的事件连接到 AWS AppSync,如早期的 博客文章 所述,并在 Serverless Land 模式中可用API Key,OAuth。这一方法适用于处理“带外”更新,其中数据的变更发生在 AWS AppSync 突变之外。带外更新通常需要在 AWS AppSync 中使用 NONE 数据源来通知订阅者这些变更,如 AWS rePost 知识中心 所描述。将 AWS AppSync 添加为 EventBridge 的目标简化了这些用例,现在您可以在响应事件时触发突变,而无需额外代码。

机场运营事件

扩展场景,机场运营事件如下:

json{ flightNum 123 carrierCode JK date 20240125 event FlightDelayed message 延误15分钟,晚点航班 info { newDepTime 20240125T131500Z delayMinutes 15 }}

事件字段标识事件类型及其是否与乘客相关。事件详细信息提供了关于事件的进一步信息,具体内容因事件类型而异。机场发布多种事件,但机场显示屏只需部分变更。

AWS AppSync GraphQL API 从 GraphQL 架构开始,该架构定义了该 API 可用的类型、字段和操作。 AWS AppSync 文档 提供架构及其他 GraphQL 基础知识的概述。以下是机场场景的部分 GraphQL 架构:

graphqltype 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 @awssubscribe(mutations [updateFlightStatus])}

schema { query Query mutation Mutation subscription Subscription}

将 EventBridge 连接到 AWS AppSync

EventBridge 允许您过滤、转换和路由事件到多个目标。机场显示服务只需要直接影响乘客的事件。您可以在 EventBridge 中定义一个规则,仅将那些事件包含在之前的 GraphQL 架构中路由到 AWS AppSync 目标。其他事件则根据其他规则路由或丢弃。有关创建 EventBridge 规则和事件匹配模式格式的详细信息,请参考 EventBridge 文档。

之前的航班延误事件将通过 EventBridge 传递,具体如下:

json{ id b051312994104931b0980d1ad1c5340f detailtype Operations Flight delayed source airportoperations time 20240125T165837Z detail { flightNum 123 carrierCode JK date 20240125 event FlightDelayed message 延误15分钟,晚点航班 info { newDepTime 20240125T131500Z delayMinutes 15 } }}

在此情境中,有一系列具体事件感兴趣,但 EventBridge 提供了一套灵活的 操作,用于匹配模式、检查数组以及通过前缀、数值或其他内容过滤。有些组织还允许订阅者在 EventBridge 事件总线上定义自己的规则,允许目标通过自助服务订阅事件。

以下事件模式匹配机场显示服务所需的事件:

json{ source [ airportoperations ] detail { event [ FlightArrived FlightBoarding FlightCancelled ] }}

要创建新的 EventBridge 规则,您可以使用 AWS 管理控制台或基础设施即代码。您可以在本文后面找到包含 AWS AppSync 目标的完成规则的 CloudFormation 定义。

创建 AWS AppSync 目标

现在 EventBridge 已配置为路由所需事件,为规则定义 AWS AppSync 作为目标。AWS AppSync API 必须 支持 IAM 授权,才能用作 EventBridge 目标。AWS AppSync 支持在单个 GraphQL 类型上使用多种授权类型,因此您也可以根据需要使用 OpenID Connect、Amazon Cognito 用户池或其他授权方法。

要将 AWS AppSync 配置为 EventBridge 的目标,请使用 AWS 管理控制台或基础设施即代码定义目标。在控制台中,选择“目标类型”为“AWS 服务”,并将“目标”选择为“AppSync”。选择您的 API。EventBridge 会解析 GraphQL 架构,并允许您选择当规则触发时调用的突变。

使用 AWS 管理控制台时,EventBridge 还会配置所需的 AWS IAM 角色以调用所选的突变。请记得在使用 IaC 配置时创建并关联一个具有适当信任策略的角色。

EventBridge 支持 输入转换,以在将事件内容作为输入传递给目标之前自定义事件的内容。配置输入转换器以使用 JSON 路径从事件中提取所需值,并使用 AWS AppSync API 所需的输入格式模板。EventBridge 提供了一个便捷的工具,以便在控制台中传递和测试示例事件的输出。

最后,配置选择集以包含来自 AWS AppSync API 的响应。这些字段将在突变被调用时返回给 EventBridge。虽然返回给 EventBridge 的结果在调试之外并不特别有用,但突变选择集还将决定可供“onFlightStatusUpdate”订阅者访问的字段。

在 CloudFormation 中定义 EventBridge 到 AWS AppSync 的规则

基础设施即代码模板,包括 AWS CloudFormation 和 AWS CDK,对于对基础设施定义进行编码以便跨区域和账户部署非常有用。虽然您可以手动编写 CloudFormation,EventBridge 在 AWS 管理控制台中提供了一个有用的 CloudFormation 导出。您可以使用此功能导出已定义规则的定义。

这是之前配置的规则和 AWS AppSync 目标的 CloudFormation 定义。该代码块包括规则定义和目标配置。

yamlPassengerEventsToDisplayServiceRule Type AWSEventsRule Properties Description Route passenger related events to the display service endpoint EventBusName ebtoappsync EventPattern source airportoperations detail event FlightArrived FlightBoarding FlightCancelled FlightDelayed FlightGateChanged FlightLanded FlightPushBack FlightTookOff Name passengereventstodisplayservice State ENABLED Targets Id 12344535353263463 Arn ltAppSync API GraphQL API ARNgt RoleArn ltEventBridge Role ARN (defined elsewhere)gt InputTransformer InputPathsMap carrier detailcarrierCode date detaildate event detailevent extra detailinfo message detailmessage num detailflightNum InputTemplate { input { num ltnumgt carrier ltcarriergt date ltdategt event lteventgt message ltmessagegt extra ltextragt } } AppSyncParameters GraphQLOperation gt mutation UpdateFlightStatus(inputStatusUpdateInput!){updateFlightStatus(inputinput){ event date carrier num info { typename on DelayEventInfo { message delayMinutes newDepTime } } }}

AWS AppSync API 的 ARN 形式为 arnawsappsyncltAWSREGIONgtltACCOUNTIDgtendpoints/graphqlapi/ltGRAPHQLENDPOINTIDgt。该 ARN 可以在 CloudFormation 中找到见 GraphQLEndpointArn 返回值或使用在 AWS AppSync GraphQL 端点中找到的标识符创建。事件桥执行角色策略中包含的 ARN 为 AWS AppSync API ARN不同的 ARN。

使用 Amazon EventBridge 和 AWS AppSync 构建实时应用程序 计算博客

AppSyncParameters 字段包括 EventBridge 在 AWS AppSync API 上调用的 GraphQL 操作。此操作必须样式良好并与 GraphQL 架构匹配。包括任何必须对订阅者可用的字段在选择集中。

测试订阅

AWS AppSync 现在已配置为 EventBridge 规则的目标。实际的显示应用程序将使用 GraphQL 库,例如 AWS Amplify,以订阅实时数据更改。AWS 管理控制台提供了一个有用的工具来进行测试。导航到 AWS AppSync 控制台,在您的 API 菜单中选择查询。输入以下查询并选择 运行,以订阅数据更改:

graphqlsubscription MySubscription { onFlightStatusUpdate { carrier date event num info { typename on DelayEventInfo { message delayMinutes newDepTime } } }}

在另一个浏览器标签页中,导航到 EventBridge 控制台,选择 发送事件。在 发送事件 页面,选择所需的事件总线并将 事件源 设置为“airportoperations”。然后输入您选择的详细类型。最后,将以下内容粘贴为 事件详细信息 并选择 发送。

json{ id b051312994104931b0980d1ad1c5340f detailtype Operations Flight delayed source airportoperations time 20240125T165837Z detail { flightNum 123 carrierCode JK date 20240125 event FlightDelayed message 延误15分钟,晚点航班 info { newDepTime 20240125T131500Z delayMinutes 15 } }}

返回到您浏览器中的 AWS AppSync 标签,查看结果窗格中的数据更改:

结论

直接从 EventBridge 调用 AWS AppSync GraphQL API 目标简化了这两个服务之间的集成,非常适合在事件驱动工作负载中通知多种订阅者数据更改。您还可以利用这两项服务提供的其他功能。例如,使用 AWS AppSync 增强的订阅过滤 来仅更新位于特定航站楼的机场显示。

要了解更多关于无服务器的信息,请访问 Serverless Land,这里提供了众多可重用的

TCS通过AWS培训的入门级人才加速云端发展 培训与认证博客

TCS通过AWS培训的入门级人才加速云端发展 培训与认证博客

TCS借助AWS培训的初级人才加速云业务增长关键要点TCS与AWS合作,加速数字化转型。初级员工需获得AWS认证,以便更快部署。TCS通过AWS Academy选拔具备云技能的人才。该公司在推动多样性...

开启您的云财务管理之旅:成本节省 云财务管理

开启您的云财务管理之旅:成本节省 云财务管理

开始您的云端财务管理之旅:节省成本关键要点在本文中,我们将探讨如何透过有效的云端财务管理来实现成本节省。我们将分享许多工具和定价模型,帮助您识别优化开支的机会。在开始云端财务管理(CFM)计划时,从零...

订阅