Appsync/GraphQL 是实时显示缩减的基于 S3 的时间序列数据的良好解决方案吗?

Posted

技术标签:

【中文标题】Appsync/GraphQL 是实时显示缩减的基于 S3 的时间序列数据的良好解决方案吗?【英文标题】:Is Appsync/GraphQL a good solution for real-time display of reduced S3-based time series data? 【发布时间】:2018-09-20 14:49:33 【问题描述】:

我将包含时间序列样本数据的 JSON 文件输入 S3。我有一个带有组件的 React 客户端,该组件需要显示最近 x 分钟的样本数据的最新统计平均值。

理想情况下,更新将由 S3 上传触发,而不是浏览器需要轮询 Web 服务。 Websockets 和服务器发送事件不是一个选项。考虑到这些要求,我是否可以实际使用 AWS Appsync 的订阅来提供实时数据?

如果需要,我不反对使用中间数据库。我认为查询数据以计算平均值的时间范围的步骤将是有益的,并且我假设我将使用 S3 触发 Lambda 并使用它将 S3 对象数据拉入数据库。

亚马逊宣布在 2 月份加入 Local Resolvers

例如,Lambda 函数可以调用 GraphQL 突变到 AWS AppSync 以响应发生的某些事件,例如处理上传到 S3 存储桶的数据

这听起来很有希望,但我找不到任何涉及本地解析器和 Lambda/S3 的示例。我能找到的唯一文档是here。

编辑:

阅读 GraphQL 后,我了解了 API,看来我应该能够在 lambda 中使用 HTTP 客户端来进行突变。用 curl 试了一下,效果很好:

curl -X POST \
   https://censored.appsync-api.us-east-1.amazonaws.com/graphql \
   -H 'Content-Type: application/json' \
   -H 'x-api-key: censored' \
   -d '"query": "mutation CreateEvent createEvent(name: \"testName\", when: \"Now\", where: \"here\", description: \"testDescription\") name when where description"'

有了这个,我想我现在可以通过 Lambda 调用“addIntervalData”突变,将每个 S3 对象的内容添加到数据库中,并使用 lambda 解析器来实现“getAverage”并进行平均计算。方向似乎不错?

【问题讨论】:

【参考方案1】:

听起来可能 - 您要做的是拥有一个 Lambda 函数,该函数对 AppSync 执行 GraphQL 突变,该突变使用 @aws_subscribe() 指令通知订阅的客户。然后,要触发该 Lambda 函数,您将使用 S3 事件源来调用它。这是一个教程:https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html

【讨论】:

第二部分很好 - 但我如何“拥有一个对 AppSync 进行 GraphQL 突变的 Lambda 函数”?我可以找到的一个教程在这里:docs.aws.amazon.com/appsync/latest/devguide/… ...但它打算从 AppSync 调用,并带有一个执行实际突变的回调函数。如果 S3 事件是调用者,则不会提供此回调。 @davegravy 它只是 NodeJS(或其他语言,如果你有 GraphQL 客户端)中的标准 GraphQL 突变,就像你从任何客户端一样。因此,S3 事件将调用 Lambda,而 Lambda 将执行突变。一种可能是使用 AWS Amplify API 类别进行突变:aws.github.io/aws-amplify/media/api_guide

以上是关于Appsync/GraphQL 是实时显示缩减的基于 S3 的时间序列数据的良好解决方案吗?的主要内容,如果未能解决你的问题,请参考以下文章

AWS AppSync - 从 AppSync 控制台运行时的 GraphQL 查询超时

AppSync GraphQL 订阅以分组数据

使用 cognito 进行 Appsync graphql 授权

AWS AppSync GraphQL 读取策略没有任何效果

AWS AppSync GraphQL 输入验证 - 忽略额外字段?

放大/反应 AppSync graphql 订阅 @auth 错误