Aws lambda AWS AppSync在解析子资源之前等待DynamoDB Streams Lambda函数

Aws lambda AWS AppSync在解析子资源之前等待DynamoDB Streams Lambda函数,aws-lambda,amazon-dynamodb,graphql,amazon-dynamodb-streams,aws-appsync,Aws Lambda,Amazon Dynamodb,Graphql,Amazon Dynamodb Streams,Aws Appsync,我有如下类似的GraphQL模式。在一个Bravo中有多个字母,每个字母都有一个相互引用。(布拉沃可以得到它的阿尔法,阿尔法可以得到它的布拉沃。) 可以看出,这两种类型都有一个值。Alpha的值是任意的,但Bravo的值是其相关Alpha的总和。出于性能(和成本)原因,Bravo的值被缓存在DynamoDB表中,并在Alpha更新时进行修改 Alpha使用简单的AppSync DynamoDBPutItemresolver更新,其目的是通过Lambda函数监视表的流来更新其Bravo值。这在很大

我有如下类似的GraphQL模式。在一个Bravo中有多个字母,每个字母都有一个相互引用。(布拉沃可以得到它的阿尔法,阿尔法可以得到它的布拉沃。)

可以看出,这两种类型都有一个值。Alpha的值是任意的,但Bravo的值是其相关Alpha的总和。出于性能(和成本)原因,Bravo的值被缓存在DynamoDB表中,并在Alpha更新时进行修改

Alpha使用简单的AppSync DynamoDB
PutItem
resolver更新,其目的是通过Lambda函数监视表的流来更新其Bravo值。这在很大程度上是有效的;我可以把alpha和随机值放在一起,我可以得到它们的Bravo值

当我试图在同一请求中请求Bravo的值时,就会出现问题。(Lambda函数从流中更新它需要一些时间。)

自然地,这将返回
bravo
的旧缓存
值,因为在解析bravo时Lambda函数尚未运行

在解析
bravo
或可能使
PutItem
操作同步之前,是否有任何方法等待DynamoDB流的Lambda函数启动

我能想到的唯一替代方法是将
putAlpha
解析器设置为Lambda函数,而不是简单的解析器,并在其中执行Bravo更新逻辑


这种Lambda持续更新缓存值是正常的,还是我做错了什么?

如果您知道在运行updateAlpha时Bravo的下一个值应该是什么(例如,您不需要读取其他字母),则可以使用BatchPutItem更新这两个表

如果不是,我认为AppSync目前还不能完全支持这个用例

要使其工作,您需要等待Bravo记录在读取之前得到更新。我认为目前最简单的方法是使用Lambda函数

其他一些你可以尝试的东西(它们有点粗糙):

  • 使putAlpha变异解析器在循环中旋转指定的时间量,直到流更新Bravo记录
  • 在Alpha.bravo上添加一个解析器,它在从表中读取之前在请求映射模板中等待X amount
  • 在Bravo.value上添加一个解析器,该解析器查询所有字母,对其值求和,然后返回求和值。这种做法违背了在Bravo上存储值的目的
  • 我不认为您可以在解析器中使用睡眠,但您可以使用循环:


    希望这有帮助

    我认为您的客户应该知道Bravo的价值是在后台计算的。 如果这不是一个折衷,你可以考虑把Bravo的更新逻辑转换成Potoα变异。 (为了避免竞争条件,可以使用UpdateExpression的ADD操作。)

    一种方法是通过流中的API更新Bravo的值,并在客户端订阅Bravo的更新。可以在Lambda中运行aws appsync,但需要提供窗口、xhr等

    其他两种方式:

  • 您可以增加客户端缓存中Bravo的值,而不是从putAlpha的响应中获取它
  • 一旦Bravo的值被更新,您就可以检索它。 (它可能会在几秒钟后更新。也许你有办法验证这个Alpha是否应用于Bravo,将最后一个Alpha的更新时间存储到Bravo可以工作。)

  • 谢谢,我认为在Lambda函数中执行
    putAlpha
    变异中的更新是一种方法。谢谢!我决定使用一个
    putAlpha
    Lambda函数解析器来处理对Bravo的更新。不过这里有一些有趣的想法。
    type Alpha {
      id: ID!
      value: Int!
      bravo: Bravo!
    }
    
    type Bravo {
      value: Int!
      alphas: [Alpha!]!
    }
    
    input InputAlpha {
      value: Int!
    }
    
    type Mutation {
      putAlpha(alpha: InputAlpha): Alpha!
    }
    
    schema {
      mutation: Mutation
    }
    
    mutation putAlpha {
      putAlpha(alpha: {
          value: 10
      }) {
        id
        value
        bravo {
          value
        }
      }
    }