首页 > 解决方案 > AWS Lambda 缓存 DynamoDB 响应

问题描述

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

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

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

如果我的解释不清楚,让我分享示例:

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

你能否请教一下这种行为的原因。lambda 中不会抛出任何错误,如果执行间隔较长时间(例如一分钟或两分钟),则一切正常,在 CloudWatch 中,我清楚地看到一个执行在第二个开始之前完成。

也许在 Lambda 或 DynamoDB 中有某种缓存机制可以记住最后的 DynamoDB 响应并在执行相同的查询时将其重新发送到 Lambda(即使同时修改了下面的数据)?“缓存想法”背后的提示是因为第二个 lambda 执行比第一个快得多(第一个需要 ~1s,第二个 ~200 ms)

标签: aws-lambdaamazon-dynamodb

解决方案


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

我建议如下实现 lambda 函数:

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

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


推荐阅读