DynamoDB ThrottlingException 问题

siv*_*iva 9 throttling amazon-web-services amazon-dynamodb

我有一个名为 的 dynamodb 表events。在此表中,我存储events用户执行的所有操作(page_view、product_view、add_cart、purchase)。

所以架构是

partition_key : <user_id>
attributes : {"vector" : <[list of events]>}
Run Code Online (Sandbox Code Playgroud)

最近我遇到了这样的问题

An error occurred (ThrottlingException) when calling the UpdateItem operation: Throughput exceeds the current capacity of your table or index. 

DynamoDB is automatically scaling your table or index so please try again shortly. 

If exceptions persist, check if you have a hot key: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html

Run Code Online (Sandbox Code Playgroud)

我认为这与 aws-limits 问题有关,我达到了 awssupport team来增加限制。

增加限制后,我们再次遇到同样的问题。

谁能为此建议一个解决方案?

Mau*_*lik 11

我在 DynamoDB 的单个分区上插入/更新/删除约 1500 到约 3000 条大小约 10kb 的记录时也遇到了这个问题,单个分区消耗约 100000 WCU。

\n

这会导致上述异常,

\n

让我们了解一下这里的部分异常:

\n
\n

吞吐量超出了表或索引的当前容量。DynamoDB 正在自动扩展您的表或索引,因此请稍后重试

\n
\n

表示超出当前 RCU/WCU(适用于 On-Demand 或 Provision 模式)

\n
\n

如果异常仍然存在,请检查您是否有热键

\n
\n

即所选分区已成为热门分区,因为超过了WCU/RCU

\n

请参阅此内容以计算 DynamoDB 中的 RCU/WCU:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html

\n
\n

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html

\n
\n

这里 dynamo 建议根据下面的示例重新设计分区键,因此我的情况属于第二种情况,即我只有单个分区并且在排序器时间内执行高 CRUD 操作。

\n

在此输入图像描述

\n

现在支持这个用例

\n
\n

Dynamo强烈建议您使用指数退避算法。如果\n您立即重试批处理操作,则基础读取或\n写入请求仍可能因各个表的限制而失败。\n 如果使用指数退避来延迟批处理操作,\n批处理中的各个请求更有可能成功。

\n
\n

Dynamo 建议在两者之间添加延迟,考虑到 Dynamo 已经基于 AWS SDK\xe2\x80\x99s 默认实现通过指数退避算法执行了重试,因此重试在这里可能没有帮助。

\n

所以我实施了这两个步骤来解决这个问题

\n
    \n
  1. 将我的所有多重操作分成 200 个项目的批次DocumentBatchWrite(对于较小的记录集 ~500 个 ~10kb 大小的记录来说效果很好)

    \n
  2. \n
  3. 对于数千条记录(上述大小相同),我根据批处理大小在每个批处理操作之间添加了 1-2 秒的延迟。

    \n
  4. \n
\n

此后,我不会遇到 DynamoDB 的任何限制异常

\n
\n

注意:需要根据记录数调整批量大小和批量操作之间的延迟\n。

\n
\n

请参阅此内容以获取有关 DynamoDB 限制的建议性解决方案:https://aws.amazon.com/premiumsupport/knowledge-center/dynamodb-table-throttled/

\n