DynamoDB 何时限制请求?

Posted

技术标签:

【中文标题】DynamoDB 何时限制请求?【英文标题】:When does DynamoDB throttle request? 【发布时间】:2013-06-03 13:24:26 【问题描述】:

在对“How is Amazon DynamoDB throughput calculated and limited?”的回答中,有人建议,只要您超过每秒预置的吞吐量,DynamoDB 就会限制请求。但是,这与我的经验相矛盾。

我在表格中发布了多行,通常行数超过了预置的写入容量。这会在短时间内发生。在某一时刻,我什至比预置容量平均高出 5 分钟。 OTOH,15 分钟的平均值低于容量。在此期间,我没有收到任何限制请求。

5 分钟平均峰值为 8.053,预置容量为 6:

15 分钟的平均峰值远低于预置容量:

那么 它考虑了什么样的平均值?在受到限制之前,突增的容量可以高于预置容量多少?

【问题讨论】:

【参考方案1】:

DynamoDB 旨在确保您的预置容量每秒可用。如果您为每秒 10 次 1kB 读取配置一个表,那么 DynamoDB 将为您提供足够的容量来处理该吞吐率。此外,DynamoDB 有时会允许您在短时间内实现超出预置吞吐量的有限突增。这是为了吸收客户工作负载的自然变化。这种突发无法保证并且并不总是可用(并且可用突发的性质可能会随着时间而改变)。正如最佳实践文档中当前描述的那样,为了获得最佳性能,您应该有一个不超过您的预置容量的均匀分布的工作负载,并将负载均匀分布在关键空间上。但是,如果您的应用程序的实际生产行为偏离均匀分布的工作负载,那么 DynamoDB 可能会吸收一些突发事件。

至于要配置多少表,很大程度上取决于您的工作量。您可以从预置峰值的 80% 开始,然后根据收到的限制数量(您可以在 CloudWatch 图表中看到)和应用程序对重试引起的延迟的容忍度来调整表容量。请记住,DynamoDB 不允许超出您的预置容量的无限突发。您可能能够吸收短时间的突发,但您无法在较长时间内维持高于预置容量水平的吞吐率。我们可以提供的一般指导是提供接近峰值的东西,然后在观察油门时向下拨。

This answer was posted in AWS forums

免责声明:我为 Amazon DynamoDB 团队工作。

【讨论】:

80% 的峰值是指5 分钟平均值 图表上的峰值吗?换句话说,假设我有每 10 秒有一批 60 件物品的情况。每秒是 60,每分钟或更长时间是 6。那么峰值有多高? "那么峰值有多高?"我想我不能告诉你,对不起。我们所有的计算/会计都是每秒完成的。对于突发流量,我们考虑更长的时间段来分析流量模式。最后,正如帖子所示,最好的做法是反复试验,因为您知道自己的使用模式以及重试/限制的容忍度。 在我自己的开发测试中,我配置了一个具有 1 个写入单元的表,并且可以持续每秒推送 10 次写入而不会受到限制,所以@vartec 所说的与我自己的经验一致,无论这可能或可能不是。 在供应方面,使用 Dynamic DynamoDB 等工具将根据您当前的需求自动扩展供应。因此,您不必担心确切的供应需求。阅读更多项目页面dynamic-dynamodb.readthedocs.org/en/latest 我正在对我的 API 进行负载测试,该 API 在执行事务的后端有 dynamodb。我总是传递相同的主键来更新表。这意味着,我总是在更新该表的同一行。我收到油门错误。你能看看这个吗? ***.com/questions/59929823/…【参考方案2】:

有一个hint in the DynamoDB documentation 解释了突发的工作原理:

当您没有充分利用分区的吞吐量时,DynamoDB 会保留一部分未使用的容量,以供以后突增使用吞吐量。 DynamoDB 目前最多保留五分钟(300 秒)未使用的读写容量。

但它也说你不能依赖这种行为:

但是,不要将您的应用程序设计为依赖于随时可用的突发容量:DynamoDB 可以并且确实将突发容量用于后台维护和其他任务,恕不另行通知。

至少这可以解释为什么有 5 分钟的平均值可能高于预置容量。根据上面的解释,如果您在间隔的一开始就出现峰值并且在开始前的 300 秒内使用量减少,那么 15 分钟的平均值(或更长的时间跨度)甚至可能超过预置容量间隔。

【讨论】:

也在 AWS DynamoDB 文档的this page 中提到。【参考方案3】:

DynamoDB 通过提供突增容量,为您的每个分区的吞吐量配置提供了一定的灵活性。每当您没有完全使用分区的吞吐量时,DynamoDB 都会保留一部分未使用的容量以供以后的吞吐量突增以处理使用高峰。

DynamoDB 目前最多保留 5 分钟(300 秒)未使用的读写容量。在偶尔爆发的读取或写入活动期间,这些额外的容量单位可能会很快被消耗掉,甚至比您为表定义的每秒预置吞吐量容量还要快。

DynamoDB 还可以在不事先通知的情况下消耗突发容量用于后台维护和其他任务。

【讨论】:

以上是关于DynamoDB 何时限制请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS 放大 DynamoDB 架构中设置嵌套字段的限制?

如何将DynamoDB放入请求放入队列

Dynamodb 与 Redis

DynamoDB 读取请求单位和写入请求单位

AWS DynamoDB批量获取请求 - iOS

DynamoDB读取吞吐量低于容量而没有任何限制