使用DynamoDB的小型应用程序中的均匀分布分区键中有任何真正的含义



Amazon DynamoDB Doc专注于分区统一分布是创建正确的DB体系结构的最重要点。另一方面,当事情变成实数时,您会发现您的应用永远不会脱离一个分区。也就是说,根据文档:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/guidelinesfortables.html#guidelinesfortables.partitions分区计算公式为

( readCapacityUnits / 3,000 ) + ( writeCapacityUnits / 1,000 ) = initialPartitions (rounded up)

因此,您需要超过1000个每秒的写入(1 KB数据(才能从一个分区中出来。但是,根据我对大多数小应用程序的计算,您甚至不需要默认的5次写入-1就足够了。(确切地说,如果您的数据超过10GB,则可以退出一个分区,但也是一个大数字(。

当您意识到创建任何其他索引需要每秒分配的其他写入时,问题就变得越来越重要。试想一下,我有一些与特定用户有关的数据,例如"帖子"。我创建"帖子"数据表,然后根据亚马逊指南选择下一个关键格式:

partition: id, // post id like uuid
sort: // don't need it

由于没有两个帖子具有相同的ID,因此我们在这里不需要排序键。但是随后,您意识到您最常见的操作是请求特定用户的帖子列表。因此,您需要创建辅助索引:

partition: userId,
sort: id // post id

但是,每个次要索引都需要额外的读/写单元,因此此决定的成本增加了一倍!另一方面,请记住您只有一个分区,您已经可以拥有这样的主要键:

partition: userId
sort: id // post id

可用于您的目的且成本不一致。所以问题是:我错过了什么吗?可能是分区密钥甚至比在一个分区内进行分类更有效吗?

加法:您可能会说:"好的,现在将用户ID作为帖子的分区密钥还可以,但是当您的应用中有100000个用户时,您会遇到缩放问题的麻烦"。但是实际上,当您只有几个分区与一组活跃用户的一组分区张贴一个分区,而另一个分区中只有几个分区时,麻烦可能只会出现在某些"过渡"案例中。如果您有成千上万的用户很自然,那么您有很多具有活跃帖子的用户,一个用户的影响可以忽略不计,并且从统计学上讲,由于大数字,他们的帖子在许多分区之间均匀分布。

我认为,如果您确保通过增加RCU/WCU或通过数据增长来确保超出分区限制,那绝对可以。而且,最佳实践说

如果表将完全适合单个分区(考虑到您的数据随时间的考虑(,并且如果您的应用程序的读取和写入吞吐量要求不超过单个分区的读取和写入功能,则您的应用程序分区不应遇到任何意外的节流。

最新更新