散列到 DocumentDB 中的分区
Hashing to partitions within DocumentDB
我正在 DocumentDB 上构建一个系统。我们正在使用分区集合。对于分区键,我们将使用一个随机数来最好地确保我们对底层分区的利用率相同(因此,对 RU 的利用率相同,因为 RU 在底层分区之间平均分配)。
我们会将分区键存储在一个标识符中,以便我们知道稍后在标识符发出请求时如何"find"文档。
话虽如此,我们正试图找出随机数范围的权衡。如果我们想保存一个字符(这在我们的用例中很重要),我们的选择类似于 [0-999] 或 [0-99]。
如果有 >99 个底层分区,我们可能没有充分利用分区,因为我们的分布不会涵盖所有可能的 "buckets"。我试图给出相反的推理 - 即,物理分区少于 99 个,将随机分布范围减小到 [0-99] 的权衡是什么?
DocumentDB 会将具有相同分区键的所有文档放在同一物理分区中。因此,具有粗分区键(具有 99 个唯一桶)的优点是 non-primary 键查询针对更大的集合,即具有相同桶的数据具有局部性并且可以用非常低的(single-digit ms) 延迟,就像对 bucket + ID 的主键查询一样。您还有一个更大的事务边界,这对于需要事务的场景可能很重要。
粗分区键的缺点是可伸缩性,就像您在问题中提到的那样。您的 data/throughput 不能超过 99 个 DocumentDB 分区所能支持的范围。同样由于散列的性质 (https://en.wikipedia.org/wiki/Birthday_problem),即使分区数少于 99,您也可能 运行 出现偏差。也就是说,如果您的 data/throughput 要求处于低端, 99是一个相当合理的数字。
这将有助于理解为什么您的应用程序需要两位数而不是三位数。您还可以通过 askdocdb@microsoft.com 与 DocumentDB 团队联系以获取更多信息 support/discussion。
我正在 DocumentDB 上构建一个系统。我们正在使用分区集合。对于分区键,我们将使用一个随机数来最好地确保我们对底层分区的利用率相同(因此,对 RU 的利用率相同,因为 RU 在底层分区之间平均分配)。
我们会将分区键存储在一个标识符中,以便我们知道稍后在标识符发出请求时如何"find"文档。
话虽如此,我们正试图找出随机数范围的权衡。如果我们想保存一个字符(这在我们的用例中很重要),我们的选择类似于 [0-999] 或 [0-99]。
如果有 >99 个底层分区,我们可能没有充分利用分区,因为我们的分布不会涵盖所有可能的 "buckets"。我试图给出相反的推理 - 即,物理分区少于 99 个,将随机分布范围减小到 [0-99] 的权衡是什么?
DocumentDB 会将具有相同分区键的所有文档放在同一物理分区中。因此,具有粗分区键(具有 99 个唯一桶)的优点是 non-primary 键查询针对更大的集合,即具有相同桶的数据具有局部性并且可以用非常低的(single-digit ms) 延迟,就像对 bucket + ID 的主键查询一样。您还有一个更大的事务边界,这对于需要事务的场景可能很重要。
粗分区键的缺点是可伸缩性,就像您在问题中提到的那样。您的 data/throughput 不能超过 99 个 DocumentDB 分区所能支持的范围。同样由于散列的性质 (https://en.wikipedia.org/wiki/Birthday_problem),即使分区数少于 99,您也可能 运行 出现偏差。也就是说,如果您的 data/throughput 要求处于低端, 99是一个相当合理的数字。
这将有助于理解为什么您的应用程序需要两位数而不是三位数。您还可以通过 askdocdb@microsoft.com 与 DocumentDB 团队联系以获取更多信息 support/discussion。