Azure cosmosdb 为什么Cosmos DB在不超过我的手动设置吞吐量的情况下,仍返回部分请求的429

Azure cosmosdb 为什么Cosmos DB在不超过我的手动设置吞吐量的情况下,仍返回部分请求的429,azure-cosmosdb,Azure Cosmosdb,我的Cosmos DB使用跨多个容器的共享吞吐量。我已经手动将Cosmos DB扩展到70000 RU/s,目前正在运行大量请求 在azure中,我可以看到我的部分请求被限制(返回429)。 要了解数字,大约25k个请求返回200个,大约5k个请求返回429个。 当我关注azure门户中的警告时,该警告说我的收集超过了配置的吞吐量,它显示平均吞吐量为6.78k RU/s 我不明白为什么当我有70000个RU/s时,我的请求被限制,而平均吞吐量应该只有6780个RU/s 没有其他容器被读取或写入,

我的Cosmos DB使用跨多个容器的共享吞吐量。我已经手动将Cosmos DB扩展到70000 RU/s,目前正在运行大量请求

在azure中,我可以看到我的部分请求被限制(返回429)。 要了解数字,大约25k个请求返回200个,大约5k个请求返回429个。 当我关注azure门户中的警告时,该警告说我的收集超过了配置的吞吐量,它显示平均吞吐量为6.78k RU/s

我不明白为什么当我有70000个RU/s时,我的请求被限制,而平均吞吐量应该只有6780个RU/s

没有其他容器被读取或写入,所有这些请求只针对一个容器。
由于所有这些请求都要运行一个存储过程,因此它们都提供了一个分区密钥。

最可能的原因是您有一个热分区,该分区在其他分区运行之前达到了分配的吞吐量

对于水平可扩展的数据库,吞吐量是跨物理分区(计算机)分配的,数据是使用分区键进行分区的,分区键基本上充当将数据路由到要存储的特定计算机的地址

假设我有一个包含三个分区1、2、3和30Kru/s的集合。其中每一个都将获得分配给它的10K RU/s。如果我运行一个在分区2上执行大量操作的操作,并且消耗了所有的10K,那么即使我不接触分区1或分区3,我也会得到速率限制(429)

为了避免这种情况,您需要选择一个分区键,该键在写入期间尽可能均匀地分布数据,理想情况下还可以用于回答一个或少量(有界)分区内的查询,尝试避免查询必须命中每个分区的“扇出”查询

现在,对于只驻留在单个物理分区上的小集合,这些都不重要,因为您的数据都位于单个物理分区上。但是,随着集合的增大,这会导致问题,从而阻止数据库完全扩展


您可以了解更多信息

感谢您的回复,如果我进入Cosmos的metrics选项卡,然后进入吞吐量并查看为我的收藏提供的图表。每个分区键范围的最大消耗RU/s都有一个,所有条的高度都非常相似,从顶部的10k到最低的7.5k。此外,无论我选择了什么,热分区键的图形都不显示任何数据。有什么想法我可以更深入地挖掘,尽管粗略地看,情况似乎不是这样的。@NPhillips我不完全确定,因为我自己没有遇到过这样的问题,但据我记忆所及,10k RU是分区的极限。所以我猜任何超过10k的都会导致429,因此我不会排除热分区的问题。@404我想你是对的,我不知道分区上的10k RU限制,但这是有意义的。我们选择的分区似乎有利于数据的均匀分布,只是我们对调用的存储过程做了太多的尝试。是的,这是正确的。10K是每个分区的限制。因此,在您的情况下,您只是耗尽了已配置的吞吐量,需要配置更多。