如何在使用 DynamoDBAutoGeneratedKey 作为哈希键的 Dynamo 数据库中对我的 table 进行性能调整,因为每次插入时 PutRequest 都变慢了

How to performance tune my table in Dynamo db having DynamoDBAutoGeneratedKey as Hash Key as the PutRequest is getting slow with each insert

我正在使用 dynamo db tables 为我的 API 请求保存交易数据。 我正在维护两个 tables 1. schedule - 以 SId 作为 hashkey 2. 总结 - 使用 DynamoDBAutoGeneratedKey (UUID) 作为 hashkey 和 SId 作为它的属性。

schedule table 每个请求填充一行,而摘要 table 每个 SId 和唯一 UUID

填充 10 个项目

我们正在 运行 对这两个 table 进行负载测试,观察到调度 table 执行良好但摘要 table 消耗很多PutRequests 中每次调用 10 个项目的时间。

任何人都可以为我的摘要 dynamodb table 提出性能调整建议吗? 可以将 UUID 保留为哈希键,减慢 PutItemRequest 的速度吗?

非常感谢任何帮助指点。

此外,我们已经激活了这些 tables 上的流,这些流被 lambda 消耗以进行交叉复制。

需要考虑的几点:

1) 对于给定的负载测试,您的数据库吞吐量是否足够高?请注意,如果您有多个分区,那么吞吐量将在它们之间分配,但如果您为每次写入使用随机 UUID,那么写入时不应该出现热分区问题。

2) 肯定是数据库变慢了还是应用程序变慢了?可能是您按顺序而不是并行执行写入,或者可能使用同步调用而不是异步调用

3) 您是否查看过控制台中的 dynamoDB 指标?您应该能够在那里看到平均放置延迟和受限请求等指标。这可能会为您提供一些启示

想到的几件事:

  • 您是否偶然使用扫描?这可以解释性能下降,因为扫描不利用任何关于数据在 DynamoDB 中如何组织的知识,而只是一种暴力搜索。您应该避免使用扫描,因为它们本来就很慢且昂贵。

  • 你有"hot partition"吗?您写道:

  1. schedule - with SId as hashkey 2. summary - with DynamoDBAutoGeneratedKey (UUID) as hashkey and SId as an Attribute to it.

访问这些值是均匀分布的吗?您是否拥有比其他人更频繁访问的项目?如果是这样,这可能是一个问题,如果您的 reads/writes 的大部分都属于 id 的一小部分,那么这意味着您正在用请求淹没单个分区(物理机)。我建议也对此进行调查。

一种解决方案是使用缓存并将经常访问的项目存储在那里。您可以使用 ElasticCache 或 DAX - Dynamo 中的新缓存解决方案。

您可以了解有关热分区的更多信息here and here

  • 您在使用交易吗?您写道:

I am using dynamo db tables for saving the transactional data

如果您的意思是您正在使用 DynamoDB 事务,则需要阅读 how DynamoDB implements transactions

长话短说,DynamoDB 会存储您在执行事务时 update/delete/add 所有项目的副本。此外,DynamoDB 事务非常昂贵,每个事务需要 7N+4 次写入,其中 N 是事务中涉及的项目数。