Aws lambda AWS AppSync在解析子资源之前等待DynamoDB Streams Lambda函数
我有如下类似的GraphQL模式。在一个Bravo中有多个字母,每个字母都有一个相互引用。(布拉沃可以得到它的阿尔法,阿尔法可以得到它的布拉沃。) 可以看出,这两种类型都有一个值。Alpha的值是任意的,但Bravo的值是其相关Alpha的总和。出于性能(和成本)原因,Bravo的值被缓存在DynamoDB表中,并在Alpha更新时进行修改 Alpha使用简单的AppSync DynamoDBAws 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值。这在很大
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
}
}
}