AWS Lambda 缓存 DynamoDB 响应

AWS Lambda caching DynamoDB response

我很难理解与 DynamoDB 配合使用的 AWS Lambda 的行为。我的 Lambda 正在做相对简单的任务:

  1. 在 DynamoDB 中查询一个特定值
  2. 在 Lambda 中增加该值
  3. 在同一 DynamoDB 记录中存储增量值

在大多数情况下,它运行良好,但在一个执行紧接着另一个执行完成的情况下(例如,第二次执行在第一次执行完成后几秒钟开始),两次执行 returns 来自 DynamoDB 的相同值(而不是第二次执行返回第一次执行的结果)

如果我的解释不清楚让我举个例子:

  1. 第一个 lambda 执行查询 DynamoDB 的值 X 是 5 时刻
  2. 第一个 lambda 执行将 X 从 5 增加到 6 第一个 lambda 执行将值为 6 的 X 存储到 DynamoDB
  3. 第一次 lambda 执行 成功完成
  4. 第二次 lambda 执行在几次后开始 秒
  5. 第二次 lambda 执行查询 DynamoDB 的值 X 是 目前为 5(我希望自第一个 lambda 以来为 6 在第二次执行之前执行已成功完成 开始)

您能告诉我这种行为的原因是什么吗? lambda 中没有错误,如果执行间隔较长时间(例如一两分钟),一切正常,在 CloudWatch 中我清楚地看到一个执行在第二个开始之前完成。

也许 Lambda 或 DynamoDB 中有某种缓存机制可以记住最后一个 DynamoDB 响应并在执行相同查询时将其重新发送给 Lambda(即使底层数据已同时被修改)? “缓存想法”背后的暗示是因为第二个 lambda 执行速度明显快于第一个(第一次需要 ~1s,第二个需要 ~200 ms)

我认为这应该是由于 ddb table 数据的最终一致性,因为您已经意识到 GSI 查询不支持 ddb 的强一致性读取,要强制执行强一致性,您必须修改您的 code/query 以强一致的方式查询X值。此外,为了确保不存在竞争情况,因为 lambda 函数可以相互覆盖 X,还需要实现乐观锁定机制 (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking.html)

我建议按如下方式实现 lambda 函数:

  1. 直接从 ddb table(而不是从 GSI)查询 X 值,使用 ddb 强一致性读取。 (例如 = 5)
  2. lambda 执行它的操作并将 X 从 5 增加到 6。
  3. 在 X 到 6 上发出 ddb table 的 ddb 条件写入,条件 X = 5。检查更新的项目计数是否 = 1,如果不是则抛出错误。

请注意,如果存在竞争条件,调用 lambda 的其他进程需要放置重试逻辑。但整体流程保证数据一致性。