使用 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 中的热分区,尤其是在请求最多的分区键保持相对不变的情况下。
扩展迈克尔的评论...
如果您现在不需要范围键...为什么要添加一个?
使用范围键的唯一原因是您需要 Query
DDB 和 return 多条记录。
如果您只需要使用 GetItem
的单个记录,那么您不需要范围键。
只需将 ${ProviderId}.${DeviceId}
连接在一起即可构成您的哈希键。
编辑
由于您希望能够列出单个提供程序的设备 ID,因此您需要将 providerID 作为分区键,将 deviceID 作为范围键。
正如 Icehorn 的回答所提到的,"hot partitions" 不像以前那么重要了。除非您希望单个 providerID 的数据超过 10GB,否则我将从 hashKey(providerID) 的简单实现开始。
如果您期望超过 10GB 的数据或者您最终遇到热分区...那么请考虑将 (1..n) 整数连接到 providerID。
这意味着您必须查询多个分区才能获取所有设备 ID。
中有详细说明
我正在考虑使用 dynamodb:LeadingKeys
向 DynamoDB table 添加行级权限以限制每个提供商 ID 的访问。目前我只有一个提供商 ID,但我知道我会拥有更多。然而,他们的供应商的规模会有所不同,这些规模非常不平衡。
如果我使用提供者 ID 作为我的分区键,在我看来我的数据库最终会为大型提供者提供非常热的分区,而为较小的提供者提供大部分未使用的分区。在添加行级访问控制之前,我使用 deviceId 作为分区键,因为它是一个更随机的名称,所以分区很好,但现在我想我必须将其移至排序键。
当前运行良好的分区:
HASHKEY: DeviceId
有了权限我想我需要去:
HASHKEY: ProviderID (only a handful of them)
RangeKey: DeviceId
关于更好的设置方法有什么建议吗?
一般来说,您不再需要担心 DynamoDB 中的热分区,尤其是在请求最多的分区键保持相对不变的情况下。
扩展迈克尔的评论...
如果您现在不需要范围键...为什么要添加一个?
使用范围键的唯一原因是您需要 Query
DDB 和 return 多条记录。
如果您只需要使用 GetItem
的单个记录,那么您不需要范围键。
只需将 ${ProviderId}.${DeviceId}
连接在一起即可构成您的哈希键。
编辑
由于您希望能够列出单个提供程序的设备 ID,因此您需要将 providerID 作为分区键,将 deviceID 作为范围键。
正如 Icehorn 的回答所提到的,"hot partitions" 不像以前那么重要了。除非您希望单个 providerID 的数据超过 10GB,否则我将从 hashKey(providerID) 的简单实现开始。
如果您期望超过 10GB 的数据或者您最终遇到热分区...那么请考虑将 (1..n) 整数连接到 providerID。
这意味着您必须查询多个分区才能获取所有设备 ID。
中有详细说明