Amazon DVA-C02: Amazon DynamoDB 与 NoSQL 设计 — 学习指南

属于 AWS Developer Associate DVA-C02 — 学习指南. 使用经过验证的答案练习: Amazon 考试中心, 或参加限时模拟考试: ExamRoll.io.

数据建模与访问模式

DynamoDB 的设计始于访问模式:每个查询都应映射到一个 primary key、global secondary index (GSI) 或 local secondary index (LSI);表的设计由应用程序读写项目的方式驱动,而不是由关系型数据库的 schema 结构驱动。选择高基数的 partition key 以避免热点分区,并在需要范围查询时使用复合主键 (composite primary key)(分区键 + 排序键);Query 操作要求对 partition key 进行等值匹配,并可选地在 sort key 上使用 KeyConditionExpression。对于 SDK,推荐使用 DynamoDB Document 抽象层:在 AWS SDK for JavaScript v3 中使用 DynamoDBDocumentClient(它会为您处理 marshall/unmarshall),或在 Java 中使用 DynamoDB Enhanced Client 将对象映射到属性。仅当读取模式共享键且您可以通过一个类型属性来编码项目类型时,才实施单表设计模式;使用稀疏 GSI (sparse GSIs) 来提供次要访问路径,方法是仅在需要它们的项目中写入这些属性。一个常见的陷阱是过度使用 Scan:扫描大型表成本高昂且是分页的(通过 LastEvaluatedKey);应优先使用带有 ProjectionExpression 的 Query 操作来减少 RCU 的使用。对于条件写入,使用带有 ConditionExpression 的 UpdateItem,或使用 TransactWriteItems 实现多项目原子性;处理 ConditionalCheckFailedException 异常并采用带抖动的退避策略。

索引、查询与事务模式

Local secondary indexes (LSI) 只能在创建表时创建,与基表共享相同的 partition key,并且查询时会消耗表的读取容量。而 GSI 可以在表创建后添加,拥有独立的容量或按需计费模式,并允许使用不同的 partition key。Query 调用使用 KeyConditionExpression 和 ExpressionAttributeNames/Values;projection expressions 可以减少数据传输量。GSI 默认是最终一致性的,并且会产生额外的写入成本,因为每次对基表的写入如果包含了被索引的属性,都会触发对 GSI 的相应写入——因此需要相应地规划 WCU,并监控索引的 ConsumedWriteCapacityUnits。要实现强一致性,请在基表上使用 GetItem 或带有 ConsistentRead=true 的 Query(GSI 不支持强一致性读取)。事务(TransactWriteItems 和 TransactGetItems)可保证最多 25 个项目或 4 MB 负载内的原子性;使用 ReturnValuesOnConditionCheckFailure 来检查失败详情。BatchWriteItem 和 BatchGetItem 分别限制为 25 和 100 个项目,并且是非事务性的;代码应通过带指数退避的重试来处理 UnprocessedItems。一个常见的陷阱是,在将关系型数据库的 join 操作迁移为索引查询时,忘记了 GSI 带来的成本和最终一致性问题。

容量模式、性能调优与故障排查

根据可预测性在预置容量和按需容量之间做出选择:带有 Auto Scaling(针对 DynamoDB 的 Application Auto Scaling)的预置模式可以为稳定的工作负载提供对 RCU/WCU 和成本的控制,而按需模式则简化了对突发流量的处理,无需进行容量规划,但单次请求的价格更高。启用 Auto Scaling 并设置目标利用率和多个扩展策略;监控 CloudWatch 指标,如 ConsumedReadCapacityUnits、ConsumedWriteCapacityUnits、ThrottledRequests、SuccessfulRequestLatency、SystemErrors 和 ConditionalCheckFailedRequests,以检测热点和节流。使用自适应容量 (adaptive capacity) 来缓解单键节流问题,但不要依赖它——设计时应确保键的均匀分布。对于读取密集型工作负载,考虑使用 DAX 实现微秒级读取,或使用 Amazon ElastiCache 进行缓存;对于写入密集型负载,使用写入分片(write sharding,如使用前缀或分桶)将写入分散到不同分区。通过检查 ProvisionedThroughputExceededException 并在 SDK 客户端中实施带抖动的指数退避来进行故障排查,启用 CloudWatch Contributor Insights 查找热点键,并使用 Parallel Scan 和分段的工作进程 (segmented workers) 进行大规模的一次性分析。记住项目大小限制(400 KB),以及大项目会增加 RCU/WCU 消耗;必要时,将大型二进制对象 (blob) 拆分到 S3 中,并在 DynamoDB 中存储其元数据。

流、集成、备份和运营最佳实践

DynamoDB Streams 按分区键顺序捕获项目级变更(INSERT、MODIFY、REMOVE),并通过事件源映射与 Lambda 直接集成(将 startingPosition 配置为 TRIM_HORIZON 或 LATEST,设置 batchSize 和 maximumBatchingWindowInSeconds,并调整 bisectBatchOnError 和 maximumRetryAttempts)。为了实现稳健的处理,请将 Lambda 与死信队列(SQS 或 SNS)结合使用,或将流记录路由到 Kinesis 或 Kinesis Data Firehose 进行分析。启用生存时间 (TTL) 以实现项目的自动过期;请注意,TTL 删除是最终处理的,不应依赖其实现即时一致性。使用时间点恢复 (PITR) 和按需备份进行灾难恢复;对于多区域可用性,请使用 Global Tables 在各区域间复制变更。为服务应用最小权限 IAM 角色,并仅为 Lambda 授予必要的 dynamodb:Query、dynamodb:PutItem、dynamodb:UpdateItem、dynamodb:GetItem、dynamodb:DescribeStream 和 dynamodb:ListStreams 操作。常见的运营陷阱包括消费者缺少重试/退避逻辑、GSI 容量规划不足,以及未能监控 Streams 的 IteratorAge 以检测延迟;使用 CloudWatch Logs 和 X-Ray 进行检测以追踪端到端延迟。

实践问题:用例场景

场景:AcmeMedia 在 us-east-1 的单个 DynamoDB 表中运行一个元数据目录,其中包含数千万个项目。一个新上线的图像处理管道需要按 photographerId 和 uploadTimestamp 范围进行低延迟查询,并且下游的 Lambda 消费者必须可靠地处理变更。

挑战:在不重新设计表的情况下,为 photographerId + timestamp 范围添加高效的查询路径,确保下游 Lambda 以至少一次语义处理流记录,并避免多产摄影师导致的热分区。

推荐方法:

  1. 创建一个名为 photographer-gsi 的 GSI,其分区键为 photographerId,排序键为 uploadTimestamp;使用 UpdateTable API 或控制台添加该 GSI,并通过 UpdateTable 指定 ProvisionedThroughput 或 On-Demand 计费模式,并设置 IndexStatus 监控。
  2. 写入项目时包含 photographerId 和 uploadTimestamp 属性,以便索引投影是稀疏的;选择 ProjectionType=INCLUDE 并包含查询所需的非键属性,以降低存储和写入成本。
  3. 在表上配置 DynamoDB Streams 为 ENABLED,并创建一个 Lambda 事件源映射,设置 startingPosition=TRIM_HORIZON,调整 batchSize(例如 100),设置 bisectBatchOnError=true,maximumRetryAttempts=2,并在 Lambda 函数配置中将一个 SQS 队列设置为死信目标 (Dead-Letter Destination)。
  4. 实现带抖动 (jitter) 的 SDK 客户端重试(使用 AWS SDK 内置的重试策略),如果单个 photographerId 仍然导致节流,则应用写入分片(在写入时为 photographerId 添加 N 个存储桶的前缀,并在客户端读取时剥离该前缀)。

基本原理:添加 GSI 暴露了所需的访问模式,而无需更改基础主键;仅投影必要的属性可降低 GSI 的写入成本。Streams + Lambda 结合 DLQ 和重试控制提供了可靠的至少一次处理,而分片可以防止高基数流量导致的热分区。


Amazon API Gateway 与应用集成 · 所有领域 · CloudFormation 与基础设施即代码 (SAM

练习这些题目 → · 在 ExamRoll.io 上限时练习 →

Pass the whole exam — not just this question

You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.

通过考试 →

浏览 Amazon →

Related guides

一体化访问

一次订阅。所有考试。

所有计划均可无限制搜索答案、进行模拟测试、获取AI解释以及访问完整的资源库 — 支持20多种语言。

每月
24.87
Just €0.83/day
包含所有内容:
  • 无限答案搜索
  • 无限模拟测试
  • AI驱动的解释
  • 完整资源库
  • 20多种语言
  • 每周内容更新
  • 奖励与推荐
  • 优先支持
开始免费试用

无需信用卡*

最具价值
12个月
179.87
Just €0.49/daySave 40%
包含所有内容:
  • 无限答案搜索
  • 无限模拟测试
  • AI驱动的解释
  • 完整资源库
  • 20多种语言
  • 每周内容更新
  • 奖励与推荐
  • 优先支持
开始免费试用

无需信用卡*

✓ 包含免费计划 · ✓ 随时取消 · ✓ 所有计划均解锁完整产品