使用 DynamoDB 行级访问控制时如何避免热分区?

How do I avoid hot partitions when using DyanmoDB row level access control?

我正在考虑使用 dynamodb:LeadingKeys 向 DynamoDB table 添加行级权限以限制每个提供商 ID 的访问。目前我只有一个提供商 ID,但我知道我会拥有更多。然而,他们的供应商的规模会有所不同,这些规模非常不平衡。

如果我使用提供者 ID 作为我的分区键,在我看来我的数据库最终会为大型提供者提供非常热的分区,而为较小的提供者提供大部分未使用的分区。在添加行级访问控制之前,我使用 deviceId 作为分区键,因为它是一个更随机的名称,所以分区很好,但现在我想我必须将其移至排序键。

当前运行良好的分区:

HASHKEY: DeviceId

有了权限我想我需要去:

HASHKEY: ProviderID (only a handful of them)
RangeKey: DeviceId

关于更好的设置方法有什么建议吗?

一般来说,您不再需要担心 DynamoDB 中的热分区,尤其是在请求最多的分区键保持相对不变的情况下。

更多信息:https://aws.amazon.com/blogs/database/how-amazon-dynamodb-adaptive-capacity-accommodates-uneven-data-access-patterns-or-why-what-you-know-about-dynamodb-might-be-outdated/

扩展迈克尔的评论...

如果您现在不需要范围键...为什么要添加一个?

使用范围键的唯一原因是您需要 Query DDB 和 return 多条记录。

如果您只需要使用 GetItem 的单个记录,那么您不需要范围键。

只需将 ${ProviderId}.${DeviceId} 连接在一起即可构成您的哈希键。

编辑
由于您希望能够列出单个提供程序的设备 ID,因此您需要将 providerID 作为分区键,将 deviceID 作为范围键。

正如 Icehorn 的回答所提到的,"hot partitions" 不像以前那么重要了。除非您希望单个 providerID 的数据超过 10GB,否则我将从 hashKey(providerID) 的简单实现开始。

如果您期望超过 10GB 的数据或者您最终遇到热分区...那么请考虑将 (1..n) 整数连接到 providerID。

这意味着您必须查询多个分区才能获取所有设备 ID。

此方法在 Multi Tenant SaaS Storage Strategies

中有详细说明