【发布时间】:2023-03-18 12:18:01
【问题描述】:
我有类似于以下的 GraphQL 架构。一个 Bravo 中有多个 Alpha,每个 Alpha 都相互引用。 (Bravo 可以得到它的 Alpha,而 Alpha 可以得到它的 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
}
如您所知,这两种类型都有一个值。 Alpha 的值是任意的,但 Bravo 的值是其相关 Alpha 的总和。出于性能(和成本)的原因,Bravo 的值缓存在 DynamoDB 表中,并在 Alpha 更新时进行修改。
Alpha 使用简单的 AppSync DynamoDB PutItem 解析器进行更新,目的是通过监视表流的 Lambda 函数更新其 Bravo 的值。这在大多数情况下效果很好。我可以给 Alpha 加上随机值,我可以得到他们 Bravo 的值。
当我尝试在同一个请求中请求 Bravo 的值时,就会出现问题。 (Lambda 函数需要一些时间从流中更新它。)
mutation putAlpha {
putAlpha(alpha: {
value: 10
}) {
id
value
bravo {
value
}
}
}
这自然会返回 bravo 的旧缓存 value,因为在解决 Bravo 时尚未运行 Lambda 函数。
有什么方法可以等到 DynamoDB 流的 Lambda 函数触发后再解析 bravo 或者让 PutItem 操作同步?
我能想到的唯一选择是将 putAlpha 解析器设为 Lambda 函数而不是简单的解析器,并在其中执行 Bravo 更新逻辑。
这种Lambda不断更新缓存值正常吗,还是我做错了什么?
【问题讨论】:
标签: aws-lambda amazon-dynamodb graphql amazon-dynamodb-streams aws-appsync