为什么 Cosmos DB return 429 对于部分请求尽管没有超过我手动设置的吞吐量
Why does Cosmos DB return 429 for a portion of requests despite not exceeding my manual set throughput
我的 Cosmos DB 跨多个容器使用共享吞吐量。我已手动将我的 Cosmos DB 扩展到 70,000 RU/s,目前我正在 运行 处理大量请求。
天蓝色,我可以看到我的一部分请求正在被限制 (returning 429)。
给出大约 25k 个请求 return 200 和大约 5k 个请求 return 429 的数字。
当我按照 azure 门户中的警告说我的集合超出了配置的吞吐量时,它显示平均吞吐量为 6.78k RU/s.
我不明白为什么当我有 70,000 RU/s 时我的请求却受到限制,而平均吞吐量应该只有 6,780 RU/s。
没有其他容器正在读取或写入,所有这些请求都是针对一个容器发出的。
由于所有这些请求都是针对 运行 存储过程的,因此它们都提供了分区键。
最可能的原因是您有一个热分区在其他分区之前达到其分配的吞吐量。
对于水平可扩展的数据库,吞吐量是跨物理分区(计算机)分配的,并且使用分区键对数据进行分区,该分区键基本上充当地址以将其路由到要存储的特定计算机。
假设我有一个包含三个分区 1、2、3 和 30K 的集合 RU/s。每一个都将获得 10K RU/s 分配给它。如果我然后 运行 一个在分区 2 上执行大量操作并消耗所有 10K 的操作,即使我不接触分区 1 或 3,我也会受到速率限制 (429)。
为避免这种情况,您需要选择一个分区键,它既可以在写入过程中尽可能均匀地分布数据,也可以理想地用于回答一个或少量(有界)分区内的查询,尽量避免“扇出”查询,其中查询必须命中每个分区。
现在对于仅驻留在单个物理分区上的小型集合 none 这很重要,因为您的数据都在单个物理分区上。但是,随着集合变大,这会导致问题,从而阻止数据库完全扩展。
你可以了解更多here
我的 Cosmos DB 跨多个容器使用共享吞吐量。我已手动将我的 Cosmos DB 扩展到 70,000 RU/s,目前我正在 运行 处理大量请求。
天蓝色,我可以看到我的一部分请求正在被限制 (returning 429)。 给出大约 25k 个请求 return 200 和大约 5k 个请求 return 429 的数字。 当我按照 azure 门户中的警告说我的集合超出了配置的吞吐量时,它显示平均吞吐量为 6.78k RU/s.
我不明白为什么当我有 70,000 RU/s 时我的请求却受到限制,而平均吞吐量应该只有 6,780 RU/s。
没有其他容器正在读取或写入,所有这些请求都是针对一个容器发出的。 由于所有这些请求都是针对 运行 存储过程的,因此它们都提供了分区键。
最可能的原因是您有一个热分区在其他分区之前达到其分配的吞吐量。
对于水平可扩展的数据库,吞吐量是跨物理分区(计算机)分配的,并且使用分区键对数据进行分区,该分区键基本上充当地址以将其路由到要存储的特定计算机。
假设我有一个包含三个分区 1、2、3 和 30K 的集合 RU/s。每一个都将获得 10K RU/s 分配给它。如果我然后 运行 一个在分区 2 上执行大量操作并消耗所有 10K 的操作,即使我不接触分区 1 或 3,我也会受到速率限制 (429)。
为避免这种情况,您需要选择一个分区键,它既可以在写入过程中尽可能均匀地分布数据,也可以理想地用于回答一个或少量(有界)分区内的查询,尽量避免“扇出”查询,其中查询必须命中每个分区。
现在对于仅驻留在单个物理分区上的小型集合 none 这很重要,因为您的数据都在单个物理分区上。但是,随着集合变大,这会导致问题,从而阻止数据库完全扩展。
你可以了解更多here