批量更新 Amazon DynamoDB 表格与 AWS Step Functions 数据库博客

使用 AWS Step Functions 批量更新 Amazon DynamoDB 表

关键要点

本文介绍了一种利用 AWS Step Functions 进行 Amazon DynamoDB 表批量更新的高效解决方案。开发者可以通过批量更新添加、修改属性,或处理不再需要的项目。AWS Step Functions 具备无服务器架构、可并行处理和恢复失败的能力,适合用于大规模批量更新。解决方案的上限为包含 1800 亿条,每条平均 4KB 的项目的 DynamoDB 表。

批量更新的需求

开发者经常需要对其 Amazon DynamoDB 表进行批量更新。进行批量更新的原因可能包括:

添加或更新属性:例如,为了支持新的访问模式或全球二级索引GSI,为现有项目填充 Time to LiveTTL值,或者从另一个数据集中丰富数据。主动查找并删除不再需要的项目:无需使用原生 TTL 功能,特别是在游戏行业,可能需要查找并删除过期的玩家统计数据。

需要注意的是,DynamoDB 不提供原生支持批量更新的功能,因此开发者必须构建和管理自己的解决方案。可考虑的多种方法包括使用 Amazon EMR 或 AWS Glue。

在本文中,我们将介绍如何利用 AWS Step Functions 高效进行 DynamoDB 表的批量更新。该无服务器编排服务使您能够与 Lambda 函数及其他 AWS 服务进行集成。您可以根据需要修改、部署并测试该解决方案,以满足自己的批量更新需求。

AWS Step Functions 特性

选择 Step Functions 作为解决方案的原因有以下几点:

无服务器架构:AWS serverless支持大规模并行工作负载,包括任务队列和故障恢复允许在批量更新过程中调整表的需求和速度易于与已经使用 AWS Lambda 的开发者进行整合可通过 AWS 管理控制台、AWS 命令行接口AWS CLI或 SDK 进行监控

方案概述

一个高效的批量更新应该在 DynamoDB 表分区 之间分配工作。通过 并行扫描,您可以将表逻辑上划分为指定数量的分段。在此方案中,会随机处理这些分段,以提高工作效率。Step Functions 将分段分配给并发的 Lambda 函数调用。每个 Lambda 函数调用逐一迭代并更新其分配的分段中的项目。

以下是三个 Lambda 函数的示意图,每个函数处理一个随机选定的分段,共有十个分段覆盖一个由四个分区组成的 DynamoDB 表。

下面的架构示意图展示了解决方案的整体构成:

该解决方案包含以下关键组件:

Step Functions:此无服务器编排服务允许您与 Lambda 函数和其他 AWS 服务集成,用于构建关键业务应用。Step Functions 将控制批量更新过程,采用 分布式映射 状态。Lambda:此计算服务使您无须配置或管理服务器即可运行代码。解决方案中包含两个 Lambda 函数由 Step Functions 调用和监控:GenerateSegments:此函数一次性调用以生成所需数量的分段并将它们随机排序进行处理。ScanAndUpdateTable:此函数被多次调用。每次调用更新分配分段中的所有项目。Amazon Simple Storage Service (Amazon S3):此对象存储服务提供行业领先的可扩展性、数据可用性、安全性和性能。S3 用于存储批量更新作业配置。DynamoDB:此完全管理的无服务器 NoSQL 数据库旨在支持不同规模的高性能应用。该方案参考了两个表:一个用于读取要处理的项目,另一个用于存储修改后的项目。这可以是同一表进行就地更新,也可以是不同表用于带更新的迁移。

解决方案参数

当您部署方案时,可以控制一组参数:

SourceTable 包含要更新的项目的 DynamoDB 表名称。该表必须与部署解决方案的账户和区域相同。ConsistentRead 该过程是否使用 一致性读取。最终一致性读取的价格是强一致性读取的一半。限制部分提供了该参数的指导。默认使用强一致性读取。TotalSegments 将 SourceTable 划分的逻辑分段数量。提高此值意味着需要更多的 Lambda 函数调用来处理表,但每个调用处理的项目更少且完成时间更短。所有调用必须在最大的 Lambda 时长撰写时为 15 分钟内完成。默认为 1000,最大值为 1000000。基准和估计部分提供了该参数的指导。DestinationTable 更新后的项目将写入的 DynamoDB 表名称。这可以是 SourceTable 相同的表,该表必须在与部署解决方案的账户和区域相同。ParallelLambdaFunctions 允许的最大并发 Lambda 函数调用数量。提高此值意味着批量更新进度加快,但会进一步增加对表的需求。默认值为 10。RateLimiter 每个 Lambda 调用将尽可能快地处理项目。将此参数设置为每秒每个 Lambda 函数将处理的最大项目数量,或者 1 表示不限制速率。默认没有速率限制。基准和估计部分提供了该参数的指导。

ScanAndUpdateTable Lambda 包含一个名为 processitem 的 Python 函数,您可以根据需要修改以实现您的项目更新逻辑。具体细节请见 修改 ScanAndUpdateTable Lambda 部分。

基准和估计

我通过更新一个包含 1 亿条项目的 DynamoDB 表来基准测试此解决方案。

基准测试结果显示,每个 Lambda 调用在没有速率限制的情况下,平均每秒处理约 200 条项目。我们称之为 速率 并用其进行一些估计:

估计项数值每秒额外表写入WCUParallelLambdaFunctions 速率 平均项目 KB每秒额外表读取RCU (最终一致性读取则减半)(ParallelLambdaFunctions 速率 平均项目 KB) / 4完成总时间秒表中估计项目数量 / (ParallelLambdaFunctions 速率)TotalSegments 参数的最小值表中估计项目数量 / (期望 Lambda 调用持续时间秒 速率)

如果项目的平均大小是 4KB 或更大,则应设置 RateLimiter 以避免产生热分区。使用公式来估计您可能的最大速率:1000 / 平均项目大小KB。在上述估计中选择您所需的 速率 值。您还可以设置 RateLimiter 以获得每次 Lambda 调用可预测的吞吐量。

限制

通过将速率、TotalSegments 的最大值和最大 Lambda 函数持续时间 900 秒相乘撰写时,可以计算出该解决方案的估计上限。以下是一些示例:

平均项目大小计算速率估计上限1 KB200 (无速率限制)1800 亿条项目5 KB200 (无速率限制)1800 亿条项目100 KB1090 亿条项目200 KB545 亿条项目400 KB218 亿条项目

并行扫描操作用于处理 SourceTable。即使设置了 ConsistentRead 参数,DynamoDB 在扫描操作时也不提供快照隔离。DynamoDB 扫描操作并不能保证在请求扫描操作时,扫描中的所有读取都能看到表的一致快照。

在批量更新期间,您应考虑可能出现的竞争条件。使用强一致性读取可以降低这种可能性。如果竞争条件是一个问题,您可以在执行批量更新期间暂停其他更新表的工作负载,或投入额外的工程精力来消除竞争条件,例如,通过包含 乐观锁定。

更新单个项目是原子操作,但不利用 事务。如果您需要事务例如,确保多个项目要么全部更新成功要么全部不更新,则不应使用此解决方案。

Step Function 可能会失败,例如,如果更新遇到限制并且 SDK 自动重试 耗尽。虽然您可以 从失败位置重新执行Step Function这是一种良好的策略,但某些项目将被重新处理。您应确保项目更新是幂等的,以便安全完成重新处理。

克隆、修改和部署解决方案

接下来,我们将演示如何克隆该解决方案,修改 ScanAndUpdateTable Lambda 函数,部署并运行批量更新。

克隆解决方案

运行以下命令以克隆解决方案:

bashgit clone https//githubcom/awssamples/bulkupdateamazondynamodbtableswithawsstepfunctionsgit

进入该解决方案的目录:

bashcd bulkupdateamazondynamodbtableswithawsstepfunctions

修改 ScanAndUpdateTable Lambda

文件 functions/scanandupdatetablepy 包含 ScanAndUpdateTable Lambda 函数的源代码。它包含一个名为 processitem 的 Python 函数。使用您喜欢的文本编辑器修改并保存此函数,以实现您的项目更新逻辑。

函数中包括了几个更新示例,您可以用来添加额外属性、删除特定项目以及将项目从源表复制到目标表。

在本篇文章中,让我们将函数修改为添加 processedat 属性,并使用 UpdateItem 操作将项目保存到 DestinationTable。

部署解决方案

要部署解决方案,您需要安装 AWS 命令行接口CLI 和 无服务器应用程序模型SAMCLI。

安装完成后,使用引导式 sam deploy 开始部署,并在提示时提供参数值:

bashsam deploy guided

解决方案将被部署,并创建所有必要的资源,包括 AWS 身份访问管理IAM角色。它会显示部署的 Step Function 的 Amazon 资源编号 (ARN)。

启动并监控批量更新

您可以使用 AWS CLI 或控制台启动和监控批量更新。

要启动批量更新,运行以下 AWS CLI 命令,将 ltarngt 替换成您的已部署 Step Function 的 ARN:

bashaws stepfunctions startexecution statemachinearn ltarngt

或者,您也可以在 AWS 控制台访问已部署的 Step Function,选择 开始执行。

AWS 控制台提供一页显示正在运行的 Step Function 的概述,您可以选择 Map Run 链接以开启页面,查看批量更新的进度。

每个分段的处理状态将被显示。您可以随时通过更新此页面上的 最大并发性 值来调整批量更新的速度及其对 DynamoDB 表的影响。

您可以使用 AWS CLI 监控和更新 Step Function,使用 describeexecution、listmapruns、describemaprun 和 updatemaprun 命令。

清理

删除 S3 配置存储桶中的所有对象,并使用 sam delete 命令删除此解决方案创建的所有资源。

结论

在本文中,我们提供了一种利用 Step Functions 高效执行 DynamoDB 表批量更新的方案。您可以部署该解决方案并根据自己的批量更新需求进行修改。请务必在对生产表进行操作之前测试任何修改,并确保适当的表备份。

提供的解决方案将批量更新处理分散在表上,以提高性能并最小化对其他工作负载的影响。在更新过程中,您可以随时控制批量更新的速度及其对表的负担。

海外npv加速

该解决方案的估计上限为包含 1800 亿条,平均大小为 4KB 的 DynamoDB 表。如果您的表超过此限制,或者表中项目的平均大小超过 4KB,请查阅本帖的限制部分 EMR 或 Glue 方法可能更适合您。

如需开始使用该解决方案,请遵循本文中提供的步骤或访问 解决方案页面。

要了解更多关于 DynamoDB 的信息,请查看 DynamoDB 开发者指南。

批量更新 Amazon DynamoDB 表格与 AWS Step Functions 数据库博客

作者介绍

Chris Gillespie 是一名总部位于英国的高级解决方案架构师。他大部分时间与快速发展的“云原生”客户合作。在工作之外,他过着家庭生活,并努力保持健康。

Wolf Haldenstein律师事务所数据泄露影响350万人关键要点受影响人数:近350万人信息损失:包括全名、社会安全号码、员工识别号码、医疗诊断和医疗索赔细节泄露时间:2023年12月目前状况...

创建无服务器零售解决方案以实现无限货架功能作者:Sandeep Mehta 和 Shashank Shrivastava,2023 年 8 月 7 日在 Amazon API Gateway、Amaz...