【问题标题】:N+1 queries in AWS AppSyncAWS AppSync 中的 N+1 个查询
【发布时间】:2019-01-18 03:48:15
【问题描述】:

将 AWS AppSync 与 lambda 数据源一起使用时,您可能会遇到 N+1 查询问题。

基本上,当您的类型有单独的字段解析器并且您的查询返回这些类型的数组时,您的字段解析器 lambda 将被调用 N 次。

AWS 在解析器中引入了 BatchInvoking lambda 来解决这个问题。在这里您可以阅读更多关于该问题及其解决方案的信息:https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-lambda-resolvers.html#advanced-use-case-batching

但是,他们的解决方案不起作用。 BatchInvoking lambda 仅限于 5 个事件(文档中未说明)。这是对 N+1 问题的轻微改进(使其变为 N/5+1),但我认为这还不够,因为更复杂的查询往往会执行很长时间并且需要更多的 lambda 调用。

所以我的问题是你如何处理这个问题?有没有更好的解决方案?

【问题讨论】:

  • 我在 AWS AppSync 团队工作。我很乐意将此作为功能请求传递给自定义批量调用的批量大小。
  • 半年过去了,还没有解决办法。 @Karthik,它在路线图中吗?
  • @ArthurGurov 我认为现在最好使用 Apollo GraphQL,如果您愿意,您可以在传统的 aws ec2 实例甚至 aws lambda 上托管 apollo 服务器
  • 这个问题有什么更新吗?这是一个严重的限制
  • 刚刚用干净的设置再次测试了这个,这种未记录和不可更改的行为仍然存在。您可能希望 AWS 在 3 年不添加后至少记录此行为,但不会。

标签: amazon-web-services aws-lambda graphql aws-appsync


【解决方案1】:

在 Appsync 解决他们的问题之前,我们使用 Apollo 服务器作为 ECS 中的网关来拼接使用 Prisma 制作的模式,并在设置我们的逻辑的地方直接调用 lambdas。

对于您的请求,您可以在他们的 GitHub 存储库中跟进功能请求,遗憾的是没有太多进展。 https://github.com/aws/aws-appsync-community/issues/51

【讨论】:

    【解决方案2】:

    【讨论】:

    • 请不要发布链接,因为它们可以被删除,请复制链接中的信息并提供他们正在寻找的答案部分
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    AWS 刚刚使 AWS AppSync Lambda 解析器的批处理大小可配置 (official blog post)。

    现在,开发人员可以轻松地在其 Direct Lambda 解析器上启用批处理,并为其解析器配置最大批处理大小(最多 2000,而不是之前的固定默认值 5)。使用 Lambda 函数数据源的 AppSync 管道函数也可以使用相同的功能。

    official documentation 已更新为:

    您可以通过在解析器上配置 maxBatchSize 来为 Direct Lambda 解析器启用批处理。当 Direct Lambda 解析程序的 maxBatchSize 设置为大于 0 的值时,AWS AppSync 会批量向您的 Lambda 函数发送请求,最大大小为 maxBatchSize

    在 Direct Lambda 解析器上将 maxBatchSize 设置为 0 会关闭批处理。

    使用控制台

    您可以通过 AWS 控制台为每个解析器配置它:

    使用命令行

    AWS CLI V2AWS CLI V1 中使用--max-batch-size 参数

    aws appsync update-resolver \
      --api-id <value> \
      --type-name <value> \
      --field-name <value> \
      --max-batch-size <value>
    

    使用 CloudFormation

    属性名称为MaxBatchSize,可以在AWS::AppSync::ResolverAWS::AppSync::FunctionConfiguration上设置。

    MyResolver:
      Type: AWS::AppSync::Resolver
      Properties:
        ApiId: MyApiId
        DataSourceName: MyDataSourceName
        TypeName: MyTypeName
        FieldName: MyFieldName
        MaxBatchSize: 100
    

    官方 CloudFormation 文档更新将于本周发布

    【讨论】:

      猜你喜欢
      • 2021-02-08
      • 2019-02-04
      • 1970-01-01
      • 2019-02-25
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2020-07-16
      相关资源
      最近更新 更多