aws-lambda - AWS Lambda 缓存 DynamoDB 响应
问题描述
我很难理解与 DynamoDB 一起使用的 AWS Lambda 的行为。我的 Lambda 正在做相对简单的任务:
- 查询 DynamoDB 以获取一个特定值
- 在 Lambda 中增加该值
- 将增量值存储在同一 DynamoDB 记录中
在大多数情况下,它运行良好,但在一个执行发生在另一个执行完成之后(例如第二次执行在第一次执行完成后几秒钟开始),两个执行从 DynamoDB 返回相同的值(而不是第二次执行返回第一次执行的结果)
如果我的解释不清楚,让我分享示例:
- 第一个 lambda 执行查询 DynamoDB 的值 X,目前为 5
- 第一个 lambda 执行将 X 从 5 增加到 6 第一个 lambda 执行将具有值 6 的 X 存储到 DynamoDB
- 第一个 lambda 执行成功完成
- 几秒钟后开始第二次 lambda 执行
- 第二个 lambda 执行查询 DynamoDB 的值 X,目前是 5(我希望它是 6,因为第一个 lambda 执行在第二个执行开始之前已经成功完成)
你能否请教一下这种行为的原因。lambda 中不会抛出任何错误,如果执行间隔较长时间(例如一分钟或两分钟),则一切正常,在 CloudWatch 中,我清楚地看到一个执行在第二个开始之前完成。
也许在 Lambda 或 DynamoDB 中有某种缓存机制可以记住最后的 DynamoDB 响应并在执行相同的查询时将其重新发送到 Lambda(即使同时修改了下面的数据)?“缓存想法”背后的提示是因为第二个 lambda 执行比第一个快得多(第一个需要 ~1s,第二个 ~200 ms)
解决方案
我认为这应该是由于 ddb 表数据的最终一致性,因为您已经意识到 GSI 查询不支持 ddb 的强一致性读取,要强制执行强一致性,您必须修改代码/查询以以强一致性方式查询 X 值. 此外,为了确保没有竞争情况,因为 lambda 函数可以相互覆盖 X,还需要实现乐观锁定机制(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptimisticLocking .html )
我建议如下实现 lambda 函数:
- 直接从 ddb 表中查询 X 值(而不是从 GSI 中),使用 ddb 强一致性读取。(例如 = 5)
- lambda 做它的事情并将 X 从 5 增加到 6。
- 在 X 到 6 上发出 ddb 条件写入 ddb 表,条件 X = 5。检查更新的项目计数是否 = 1,如果没有则抛出错误。
请注意,如果存在竞争条件,则调用 lambda 的其他进程需要就地重试逻辑。但整体流程保证数据的一致性。
推荐阅读
- python - 顺时针二维矩阵旋转
- python - 如何创建具有指定行数和列数的 pandas DataFrame
- google-sheets - 按最大时间戳查询 Google 表格
- java - 由于 Android Studio 中的 ClassCastException,应用程序崩溃
- python - lightgbm 的查询信息概念是什么(用于地图度量)?
- python - 运行我的项目时没有语音响应
- java - 通过mybatis发送嵌套对象到oracle存储过程
- git - “git reset --hard”的行为
- plc - Syntax for Getting Ouput Variable in Structured Text
- r - 具有许多变量的多行的R总和