亚马逊AWS官方博客
AWS AppSync Events 正式推出:利用无服务器 WebSocket API 支持任意规模的实时 Web 与移动体验
今天,AWS AppSync 发布了 AWS AppSync Events 功能,该功能可让开发人员使用安全、高性能的无服务器 WebSocket API 向少数乃至数百万订阅用户轻松广播实时事件数据。有了 AWS AppSync Events,开发人员再也不用担心构建 WebSocket 基础设施、管理连接状态和实施扇出功能。开发人员只需创建自己的 API 并发布事件,即可通过 WebSocket 连接将事件广播给订阅的客户端。AWS AppSync Event API 是无服务器的,因此您可以快速上手,您的 API 可以自动扩展,而且您只需按实际使用量付费。在这篇博客中,我将讨论 AWS AppSync Events,介绍 AWS AppSync Event API 是什么,并向您展示如何开始使用。
实时事件更新是当今应用程序的重要组成部分,可为用户提供与众不同的体验。从实时体育比分、群聊消息、价格水平到位置更新,开发人员都希望构建出能为客户提供最新相关信息的应用程序。但这种功能并不容易实现,也很难扩展。AWS AppSync Events 的出现改变了这一局面。AWS AppSync Event API 易于设置,因此开发人员可以快速上手,并可使用标准 Web API 连接到其 WebSocket 端点。AWS AppSync Event API 是无服务器的,可以扩展到向数百万连接的客户端广播实时更新。对于已投资于事件驱动型架构的企业来说,AWS AppSync Events 支持通过 HTTP 端点进行发布。这使得与 Amazon EventBridge 等热门服务的集成变得简单,并可轻松将后端生成的事件发布到 Web 和移动应用程序。
使用 AWS AppSync Events,首先要创建一个 API 并定义其基本配置,例如支持哪些授权模式。然后,您可以通过为频道命名空间分配一个名称来创建频道命名空间,该名称也是该命名空间中所有频道的前缀。频道命名空间定义了其频道的功能。例如,使用名称为“messages
”的频道命名空间,您可以发布和订阅到以 /messages
开头的频道。命名空间中的频道是临时的,可根据需要创建。例如,您可以根据需要将事件发布到 /messages/group/admin
或 /messages/user/JohnDoe
。您可以订阅特定频道(如 /messages/user/JohnDoe
)上的事件,也可以在频道路径末尾使用通配符(如 /messages/*
或 /messages/user/*
)订阅子集上的事件。
在控制台中开始操作
您可以访问 AWS AppSync 控制台开始操作。从控制台中,选择“创建 API”,然后选择“事件 API”。为您的 API 指定一个名称,然后选择“创建”。只需几秒钟,您的 API 就已创建完毕,随时可以使用。在控制台中,服务会为您创建一个事件 API、一个默认命名空间和一个 API 密钥。您可以使用 AWS CLI、AWS SDK、AWS CloudFormation 或 AWS CDK 实现相同的结果。
接下来,前往 Pub/Sub 编辑器。该编辑器提供了一种直接从控制台进行发布和订阅的简便方法。这是快速测试想法和验证功能的好方法。您可以使用该编辑器通过 HTTP 发布事件,并通过 WebSocket 连接设置订阅。要接收事件,请在“订阅”部分中选择“连接”,然后选择“订阅”。现在,您的 API 已准备好接收发布到频道的事件。HTTP 端点支持批量发布最多 5 个事件。要从控制台发布,只需提供一个 JSON 对象数组即可。例如,在“发布”部分输入以下值:
[
{ "message": "hello world!" },
"New WebSocket API!",
true,
100,
["L", "G", "T", "M"]
]
您将在“订阅”部分收到 5 个事件!
与您的应用程序集成
构建使用 AWS AppSync Events 的应用程序非常简单。您可以使用 AppSync Events 的 Amplify 客户端,并在控制台的集成选项卡中找到 API 的配置信息。
请注意,在 Web 浏览器中连接您的 API 不需要任何外部依赖性。下面的 JavaScript 代码片段展示了如何使用浏览器的 Web API WebSocket 连接到端点。要使用此代码,请从事件 API 的设置页面,检索您的 HTTP 和实时 DNS 名称,并复制您的 API 密钥。接下来,打开页面的开发人员控制台。在代码片段中插入您的值,将该代码片段粘贴到开发人员控制台的编辑器中,然后运行代码。
const REALTIME_DOMAIN = ''
const HTTP_DOMAIN = ''
const API_KEY = ''
const authorization = { 'x-api-key': API_KEY, host: HTTP_DOMAIN }
function getAuthProtocol() {
const header = btoa(JSON.stringify(authorization))
.replace(/\+/g, '-') // Convert '+' to '-'
.replace(/\//g, '_') // Convert '/' to '_'
.replace(/=+$/, '') // Remove padding `=`
return `header-${header}`
}
const socket = await new Promise((resolve, reject) => {
const socket = new WebSocket(
`wss://${REALTIME_DOMAIN}/event/realtime`,
['aws-appsync-event-ws', getAuthProtocol()])
socket.onopen = () => {
socket.send(JSON.stringify({ type: 'connection_init' }))
resolve(socket)
}
socket.onclose = (evt) => reject(new Error(evt.reason))
socket.onmessage = (event) => console.log('=>', JSON.parse(event.data))
})
socket.send(JSON.stringify({
type: 'subscribe',
id: crypto.randomUUID(),
channel: '/default/*',
authorization
}))
您可以使用浏览器的 Web API fetch 方法发送事件。例如,在开发人员控制台中运行以下命令。
const event = {
"channel": "/default/introductions",
"events": [
JSON.stringify({message:'Hello World! Introducing AWS AppSync Events!'})
]
}
const response = await fetch(`https://${HTTP_DOMAIN}/event`, {
method: 'POST',
headers: authorization,
body: JSON.stringify(event)
})
console.log(response)
要了解有关连接、授权和如何使用 WebSockets 的更多信息,请参阅我们的文档。
使用事件处理程序
利用 AWS AppSync Events,您可以定义业务逻辑,使其在处理已发布的事件和客户端尝试订阅频道时运行。这是通过事件处理程序实现的,这些函数定义在频道命名空间中。事件处理程序是可选的,作用域为频道命名空间。AWS AppSync Events 支持 2 种类型的处理程序:onPublish 处理程序和 onSubscribe 处理程序。收到事件后,在向连接的客户端广播之前,会调用 onPublish 处理程序。通过 onPublish 处理程序,您可以转换事件有效载荷的配置、过滤掉事件并拒绝已发布的事件。处理程序在 APPSYNC_JS 运行时运行,因此只需编写 JavaScript 即可。例如,要转换事件,只需在事件数组上调用 map
,确保返回事件 id
和事件 payload
:
export function onPublish(ctx) {
return ctx.events.map(event => ({
id: event.id,
payload: {
...event.payload,
message: event.payload.message.toUpperCase()
}
}))
}
要过滤掉事件,无提示地丢弃事件,使其不会广播给订阅的客户端,请过滤列表,并返回您希望广播的内容。例如,您可以直接在事件数组上调用 filter
。想象一下,您只想广播胜率大于 90% 的比赛:
export function onPublish(ctx) {
return ctx.events.filter(event => event.payload.odds > 0.9)
}
过滤功能可让您无提示地丢弃事件,但您也可以在丢弃事件的同时向发布者返回错误。例如,强制规定事件应始终包含问候消息,并向发布者返回错误:
export function onPublish(ctx) {
return ctx.events.map(event => {
if (!event.payload.message) {
return {
...event,
error: 'You should always included a greeting.'
}
}
return event
})
}
当客户端尝试建立订阅时,会调用 onSubscribe 处理程序。您可以通过调用 util.unauthorized()
来拒绝订阅。想象一下,您想将 Amazon Cognito 用户池的认证用户限制在自己的频道内:
export function onSubscribe(ctx) {
if (ctx.info.channel.path !== `/messages/inbox/${ctx.identity.username}`) {
console.error(`user ${ctx.identity.username} tried connecting to wrong channel: ${ctx.info.channel.path}`)
util.unauthorized()
}
}
现在,客户端只能订阅符合 /messages/inbox/<username>
模式的频道。
事件驱动型架构(EDA)
AWS AppSync Events 与 EDA 模式完美契合。使用 Amazon EventBridge,您可以配置一个 API 目的地来将事件转发到 AWS AppSync Events HTTPS 端点。
在 EventBridge 控制台中,创建一个新连接,授权类型为“API 密钥”。对于 API 密钥名称,输入 x-api-key
;对于值,输入 API 密钥的值。接下来,创建一个新的 API 目的地。对于 API 目的地端点,使用 https://<HTTP_DOMAIN>/event
格式,其中 <HTTP_DOMAIN>
是您先前复制的 HTTP 域。将 HTTP 方法设置为 POST
。对于连接类型,选择刚才创建的连接,然后创建目的地。现在,您可以创建一条将目的地作为目标的规则。对于目标的输入路径(InputPath),请指定 "$.detail"
;这会将整个事件详细信息转发到事件 API。
现在,您可以将事件转发到 AWS AppSync Event。例如,使用以下事件详细信息发布到 EventBridge。
{
"channel": "/default/introductions",
"events": [
"{\"message\":\"Hello from EventBridge!\"}"
]
}
探索 API 功能
您可以使用多种授权模式配置 API,并在每个频道命名空间上配置不同的授权行为。您可以将自定义域与您的 API 关联,并附加 AWS Web Application Firewall 以进一步保护它。还可与 Amazon CloudWatch Metrics 和 Amazon CloudWatch Logs 集成,让您全面了解 API 的性能。
后续行动
在这篇文章中,我介绍了 AWS AppSync Events,并说明了如何开始使用 AWS AppSync Event API。我介绍了频道命名空间、频道、处理程序以及如何与 Amazon EventBridge 集成。
今天的发布是 AWS AppSync Events 的一个重要里程碑,但我们才刚刚起步。在不久的将来,我们计划增加对双向 WebSockets 和数据来源的支持。这将使您能够创建自定义来源和目的地,并且您可以使用 Amazon DynamoDB 或 Amazon Aurora 等数据来源来丰富或持久化您的事件。我们计划添加 AWS Lambda 函数,以替代处理程序。我们还计划支持架构验证,以便轻松共享和执行类型形状。请随时关注!
结论
AWS AppSync Events 现在可在提供 AWS AppSync 的所有区域使用。要创建您的第一个事件 API,请访问 AWS AppSync 控制台。AWS AppSync Events 是一项无服务器功能:您只需为 AWS AppSync Event API 操作和实时连接分钟数付费。开始每月免费使用 25 万次实时事件 API 操作。要了解有关 AWS AppSync Events 的更多信息,请访问我们的文档。有关定价的更多信息,请参阅我们的定价页面。
借助 AWS AppSync,可以轻松地将应用程序连接到事件、数据和 AI 模型。借助 AWS AppSync Events,您可以通过无服务器 WebSockets 向订阅的客户端发布来自任何事件源的更新,从而创建实时体验。借助 AWS AppSync GraphQL,您可以通过单个 GraphQL API 端点将应用程序连接到多个数据库、微服务和 AI 模型。