gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:59:45 27 4
gpt4 key购买 nike

我有类似于以下的 GraphQL 架构。一个 Bravo 中有多个 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 时修改。

Alphas 使用简单的 AppSync DynamoDB PutItem 解析器进行更新,目的是通过观察表流的 Lambda 函数更新其 Bravo 的值。这在大多数情况下效果很好;我可以将 Alpha 放入随机值,我可以获得它们的 Bravo 值。

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

mutation putAlpha {
putAlpha(alpha: {
value: 10
}) {
id
value
bravo {
value
}
}
}

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

有什么方法可以等到 DynamoDB 流的 Lambda 函数触发后再解析 bravo 或者让 PutItem 操作同步?

我能想到的唯一选择是使 putAlpha 解析器成为 Lambda 函数而不是简单的解析器,并在其中执行 Bravo 更新逻辑。

这种Lambda不断更新一个缓存值是正常的,还是我做错了什么?

最佳答案

我认为您的客户应该知道 Bravo 的值是在后台计算的。如果这不是您可以做出的权衡,请考虑将 Bravo 的更新逻辑移至 putAlpha 突变。(为避免竞争条件,您可以使用 UpdateExpression 的 ADD 操作。)

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

其他几种方式:

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

关于aws-lambda - AWS AppSync 在解析子资源之前等待 DynamoDB Streams Lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50649778/

27 4 0