

# 2. 超出预置吞吐量
<a name="throttling-provisioned-capacity-exceeded-mitigation"></a>

当应用程序的使用速率超过为表或全局二级索引预置的读取或写入容量单位（RCU/WCU）时，就会发生预置容量节流。虽然 DynamoDB 提供了容量爆增功能来应对偶发的流量峰值，但持续超出预置限额的请求会导致出现节流。发生这种情况时，DynamoDB 会在节流异常中返回 `ProvisionedThroughputExceeded` 节流原因类型。通过该原因，您可以确定问题出在读取还是写入操作上，以及它是影响基表还是全局二级索引。

无论是否启用了自动扩缩，都有可能会出现节流情况。自动扩缩会适应消耗量的增长，但并不能即时做出响应，并且扩缩能力受到您配置的最大容量限额的约束。这意味着，在流量突然激增或消耗量超过自动扩缩的最大限额时，仍可能出现节流。

## 超出预置吞吐量的缓解措施
<a name="throttling-provisioned-throughput-exceeded"></a>

本节针对预置容量节流场景提供解决方法指导。使用本指南之前，请确保您根据应用程序的异常处理确定了具体的节流原因，并确定了受影响资源的 Amazon 资源名称（ARN）。有关检索节流原因和识别受限制资源的信息，请参阅[DynamoDB 节流诊断框架](throttling-diagnosing-workflow.md#throttling-diagnosing)。

在深入研究具体的节流场景之前，首先请考虑节流情况是否真的是需要解决的问题：
+ 在经过良好优化的 DynamoDB 应用程序中，偶尔出现的节流是正常现象，也是意料之中的。节流仅仅意味着您已经 100% 地消耗了已配置的资源。如果应用程序能够通过重试很好地处理节流问题，并且整体性能符合要求，则可能不需要立即处理节流问题。
+ 但是，如果节流导致不可接受的客户端延迟、用户体验降级或使关键操作无法及时完成，则您应继续考虑采用以下缓解选项。

如果需要解决节流问题，请您先确定是否由以下原因引起了节流：
+ **临时流量峰值**：流量在短时间内增加，超过您的预置容量，但不会长时间持续。与持续的高流量相比，这种情况需要采用不同的策略。
+ **持续高流量**：持续的工作负载一直超过您的预置容量。

对于流量峰值，请考虑采用[其他资源](#throttling-additional-resources)中的 *Handle traffic spikes with Amazon DynamoDB provisioned capacity* 博客给出的策略。

对于持续的高流量，请考虑以下容量调整选项：
+ [TableReadProvisionedThroughputExceeded](#throttling-table-read-provisioned) 
+ [TableWriteProvisionedThroughputExceeded](#throttling-table-write-provisioned)
+ [IndexReadProvisionedThroughputExceeded](#throttling-index-read-provisioned) 
+ [IndexWriteProvisionedThroughputExceeded](#throttling-index-write-provisioned) 

### TableReadProvisionedThroughputExceeded
<a name="throttling-table-read-provisioned"></a>

**何时出现**  
应用程序的读取消耗速率超过了为表配置的[预置读取容量单位](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html#DDB-Type-ProvisionedThroughput-ReadCapacityUnits)（RCU）。您可以在 [常见的诊断和监控方法](#provisioned-capacity-exceeded-diagnosis-monitoring) 中监控 CloudWatch 指标来分析节流事件。

**解决方法**  
请考虑采用以下策略来解决读取容量节流问题：
+ **切换到按需容量模式**：如果您经常遇到流量高峰造成的节流问题，请考虑[将表切换到按需模式](#procedure-switch-ondemand)。按需模式无需考虑预置容量，并可根据工作负载自动扩展。
+ **若要保持预置模式并且不启用自动扩缩：**
  + 请考虑[增加表的读取容量](#provisioned-capacity-exceeded-increase-table-throughput)。
  + 为表上的[读取容量启用自动扩缩](#provisioned-capacity-configure-autoscaling)。
+ **如果启用了自动扩缩（在控制台中创建的表的默认设置）：**
  +  [优化表的读取自动扩缩参数](#provisioned-capacity-optimize-autoscaling-settings)。

### TableWriteProvisionedThroughputExceeded
<a name="throttling-table-write-provisioned"></a>

**何时出现**  
应用程序的写入消耗速率超过了为表配置的[预置写入容量单位](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html#DDB-Type-ProvisionedThroughput-WriteCapacityUnits)（WCU）。您可以在 [常见的诊断和监控方法](#provisioned-capacity-exceeded-diagnosis-monitoring) 中监控 CloudWatch 指标来分析节流事件。

**解决方法**  
请考虑采用以下策略来解决写入容量节流问题：
+ **切换到按需容量模式**：如果您经常遇到流量高峰造成的节流问题，请考虑[将表切换到按需模式](#procedure-switch-ondemand)。按需模式无需考虑预置容量，并可根据工作负载自动扩展。
+ **若要保持预置模式并且不启用自动扩缩：**
  + 请考虑[增加表写入容量](#provisioned-capacity-exceeded-increase-table-throughput)。
  + 为表上的[写入容量启用自动扩缩](#provisioned-capacity-configure-autoscaling)。
+ **如果启用了自动扩缩（在控制台中创建的表的默认设置）：**
  + [优化表的写入自动扩缩参数](#provisioned-capacity-optimize-autoscaling-settings)。

### IndexReadProvisionedThroughputExceeded
<a name="throttling-index-read-provisioned"></a>

**何时出现**  
某个全局二级索引（GSI）上的读取消耗量超过 GSI 的[预置读取容量单位](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html#DDB-Type-ProvisionedThroughput-ReadCapacityUnits)（RCU）。您可以在 [常见的诊断和监控方法](#provisioned-capacity-exceeded-diagnosis-monitoring) 中监控 CloudWatch 指标来分析节流事件。

**解决方法**  
请考虑采用以下策略来解决 GSI 读取容量节流问题：
+ **切换到按需容量模式**：如果您经常遇到流量高峰造成的节流问题，请考虑[将基表切换到按需模式](#procedure-switch-ondemand)。按需模式无需考虑预置容量，并可根据工作负载自动扩展。
+ **若要保持预置模式并且不启用自动扩缩：**
  + 请考虑[增加 GSI 读取容量](#provisioned-capacity-exceeded-increase-index-throughput)。
  + 为 GSI 上的[读取容量启用自动扩缩](#provisioned-capacity-configure-autoscaling)。
+ **如果启用了自动扩缩（在控制台中创建的表的默认设置）：**
  + [优化 GSI 的读取自动扩缩参数](#provisioned-capacity-optimize-autoscaling-settings)。

### IndexWriteProvisionedThroughputExceeded
<a name="throttling-index-write-provisioned"></a>

**何时出现**  
对基表中项目的更新会触发写入到某个 GSI，进而超过该 [GSI 的预置写入容量](https://docs.amazonaws.cn/amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html#DDB-Type-ProvisionedThroughput-WriteCapacityUnits)。这会导致基表写入时出现[背压节流](gsi-throttling.md)。您可以在 [常见的诊断和监控方法](#provisioned-capacity-exceeded-diagnosis-monitoring) 中监控 CloudWatch 指标来分析节流事件。

**解决方法**  
请考虑采用以下策略来解决 GSI 写入容量节流问题：
+ **切换到按需容量模式**：如果您经常遇到流量高峰造成的节流问题，请考虑[将基表切换到按需模式](#procedure-switch-ondemand)。按需模式无需考虑预置容量，并可根据工作负载自动扩展。
+ **若要保持预置模式并且不启用自动扩缩：**
  + 请考虑[增加 GSI 写入容量](#provisioned-capacity-exceeded-increase-index-throughput)。
  + 为 GSI 上的[写入容量启用自动扩缩](#provisioned-capacity-configure-autoscaling)。
+ **如果启用了自动扩缩（在控制台中创建的表的默认设置）：**
  + [优化 GSI 的写入自动扩缩参数](#provisioned-capacity-optimize-autoscaling-settings)。

## 常见的诊断和监控方法
<a name="provisioned-capacity-exceeded-diagnosis-monitoring"></a>

在对吞吐量错误进行故障排除时，可以利用多种 CloudWatch 指标来确定根本原因。

**关键 CloudWatch 指标**  
监控以下关键指标来诊断预置容量节流问题：
+ **节流事件**：[https://docs.amazonaws.cn//amazondynamodb/latest/developerguide/metrics-dimensions.html#ReadProvisionedThroughputThrottleEvents](https://docs.amazonaws.cn//amazondynamodb/latest/developerguide/metrics-dimensions.html#ReadProvisionedThroughputThrottleEvents) 和 [https://docs.amazonaws.cn//amazondynamodb/latest/developerguide/metrics-dimensions.html#WriteProvisionedThroughputThrottleEvents](https://docs.amazonaws.cn//amazondynamodb/latest/developerguide/metrics-dimensions.html#WriteProvisionedThroughputThrottleEvents) 跟踪什么时候出于此原因导致请求受限。[https://docs.amazonaws.cn//amazondynamodb/latest/developerguide/metrics-dimensions.html#ReadThrottleEvents](https://docs.amazonaws.cn//amazondynamodb/latest/developerguide/metrics-dimensions.html#ReadThrottleEvents) 和 [https://docs.amazonaws.cn//amazondynamodb/latest/developerguide/metrics-dimensions.html#WriteThrottleEvents](https://docs.amazonaws.cn//amazondynamodb/latest/developerguide/metrics-dimensions.html#WriteThrottleEvents) 跟踪什么时候读取或写入请求超出了预置容量。
+ **容量消耗**：[https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/metrics-dimensions.html#ConsumedReadCapacityUnits](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/metrics-dimensions.html#ConsumedReadCapacityUnits) 和 [https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/metrics-dimensions.html#ConsumedWriteCapacityUnits](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/metrics-dimensions.html#ConsumedWriteCapacityUnits) 显示实际使用情况。
+ **预置容量**：[https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/metrics-dimensions.html#ProvisionedReadCapacityUnits](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/metrics-dimensions.html#ProvisionedReadCapacityUnits) 和 [https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/metrics-dimensions.html#ProvisionedWriteCapacityUnits](https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/metrics-dimensions.html#ProvisionedWriteCapacityUnits) 显示配置的限额。

## 解决过程
<a name="throttling-resolution-procedures"></a>

### 增加表吞吐能力
<a name="provisioned-capacity-exceeded-increase-table-throughput"></a>

在未启用自动扩缩和您需要立即增加容量时，请使用此过程。

1. 使用 DynamoDB 控制台、Amazon CLI 或 SDK 更新表的预置容量：
   + **对于读取容量**：增加 [https://docs.amazonaws.cn//amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html](https://docs.amazonaws.cn//amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html) 参数，该参数指定每秒消耗的最大强一致性读取次数，超过该值后 DynamoDB 将限制请求。
   + **对于写入容量**：增加 [https://docs.amazonaws.cn//amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html](https://docs.amazonaws.cn//amazondynamodb/latest/APIReference/API_ProvisionedThroughput.html) 参数，该参数指定每秒消耗的写入次数，超过该值后 DynamoDB 将限制请求。

1. 确认您的新容量设置未超过[每个表的吞吐量配额](ServiceQuotas.md)，并且您的账户总消耗量低于所在区域的[每个账户的吞吐量配额](ServiceQuotas.md)。如果即将接近这些限额，请考虑改为[切换到按需容量模式](#procedure-switch-ondemand)。

### 配置表自动扩缩以调整表或 GSI 的读取或写入容量
<a name="provisioned-capacity-configure-autoscaling"></a>

将 DynamoDB [自动扩缩](AutoScaling.md)配置为根据流量模式自动调整读取或写入容量。您可以为表和 GSI 单独配置自动扩缩，并单独控制读取和写入容量单位。

1. 为表或 GSI 上的读取容量和/或写入容量启用自动扩缩。

1. 设置目标利用率百分比，为流量峰值留出余地。
**注意**  
较低的目标利用率会增加成本和扩展频率。低于 40% 的目标可能会导致预置过度。监控使用模式和成本，在性能和效率之间取得平衡。

1. 设置容量界限：
   + **最小 RCU/WCU**：在低流量时段保持足够容量。
   + **最大 RCU/WCU**：可满足峰值流量需求，并且能够防止扩展事件失控。

有关配置和管理 DynamoDB 自动扩缩的指南，请参阅[使用 DynamoDB 自动扩缩自动管理吞吐能力](AutoScaling.md)。

**注意**  
自动扩缩响应流量变化通常需要几分钟时间。对于突然的流量高峰，在自动扩缩调整的同时，表的容量爆增功能可提供即时保护。为目标利用率配置足够的余量，以便为扩展操作留出时间，并保留容量爆增功能以应对意外需求。

### 优化表或索引的读取或写入自动扩缩设置
<a name="provisioned-capacity-optimize-autoscaling-settings"></a>

当启用了[自动扩缩](AutoScaling.md)但仍出现节流时，请使用此过程。您可以针对表和全局二级索引（GSI）单独调整自动扩缩设置，并单独控制读取和写入容量单位。
+ **调整目标使用量**：请考虑降低表或 GSI 的目标使用量，以便在发生节流之前提前触发扩展。完成这些调整后，请务必监控流量。有关容量消耗和成本影响的更多信息，请参阅[配置表自动扩缩以调整表或 GSI 的读取或写入容量](#provisioned-capacity-configure-autoscaling)。
+ **查看容量边界**：确保您的最小和最大容量设置与实际工作负载模式保持一致。

### 切换到按需容量模式。
<a name="procedure-switch-ondemand"></a>

有关切换容量模式的一般信息，请参阅[在 DynamoDB 中切换容量模式时的注意事项](bp-switching-capacity-modes.md)。请参阅服务配额来了解与[切换模式时的约束](troubleshooting-throttling-diagnostics.md)相关的具体信息。

### 增加 GSI 吞吐能力
<a name="provisioned-capacity-exceeded-increase-index-throughput"></a>

当 GSI 上未启用自动扩缩或您需要立即增加容量时，请使用此过程。

1. 使用 DynamoDB 控制台、Amazon CLI 或 SDK 更新 GSI 的预置容量：
   + **对于读取容量**：增加特定 GSI 的 [https://docs.amazonaws.cn//amazondynamodb/latest/APIReference/API_GlobalSecondaryIndexUpdate.html](https://docs.amazonaws.cn//amazondynamodb/latest/APIReference/API_GlobalSecondaryIndexUpdate.html) 参数，该参数指定 GSI 每秒可以消耗的最大读取次数，超过该值后 DynamoDB 将限制请求。请注意，GSI 仅支持最终一致性读取。
   + **对于写入容量**：增加特定 GSI 的 [https://docs.amazonaws.cn//amazondynamodb/latest/APIReference/API_GlobalSecondaryIndexUpdate.html](https://docs.amazonaws.cn//amazondynamodb/latest/APIReference/API_GlobalSecondaryIndexUpdate.html) 参数，该参数指定 GSI 每秒可以消耗的最大写入次数，超过该值后 DynamoDB 将限制请求。

1. 确保 GSI 的预置吞吐量能力保持在[每个账户和每个表的吞吐量配额](ServiceQuotas.md)之内。

## 其他资源
<a name="throttling-additional-resources"></a>
+  有关处理 DynamoDB 预置容量表中流量峰值的详细信息（包括从利用自动扩缩和容量爆增功能，到利用策略性节流管理等各种策略），请参阅 [Handle traffic spikes with Amazon DynamoDB provisioned capacity](https://www.amazonaws.cn/blogs//database/handle-traffic-spikes-with-amazon-dynamodb-provisioned-capacity/)。
+ 有关如何使用 cron 表达式调度扩展策略的信息，请参阅 [Optimize costs by scheduling provisioned capacity for DynamoDB](https://www.amazonaws.cn/blogs/database/optimize-costs-by-scheduling-provisioned-capacity-for-amazon-dynamodb/)。
+ 有关监控和分析预置容量模式下 DynamoDB 表的吞吐量利用率模式的实操信息，请参阅 [How to evaluate throughput utilization for Amazon DynamoDB tables in provisioned mode](https://www.amazonaws.cn/blogs/database/how-to-evaluate-throughput-utilization-for-amazon-dynamodb-tables-in-provisioned-mode/)。