Azure Cosmos db:批量删除记录时请求超出速率限制

时间:2020-09-23 15:00:07

标签: azure azure-cosmosdb

我有一个用户使用a stored procedure从一个容器中批量删除了约5万个文档。

与此同时,另一个用户尝试登录该Web应用程序(连接到相同的cosmos db),但由于超出了速率限制,因此请求失败。

在这种情况下,为避免出现上述服务短缺的最佳做法是什么?

a)我应该按收款方式提供RU吗? b)我可以在发出请求时对通过代码进行批量操作所消耗的RU设置上限吗? c)还有其他方法吗?

有关我当前(幼稚/新手)实施的更多详细信息:

  1. 两个集合:RawDataCollection和TransformedDataCollection
  2. 分区键值为客户帐号
  3. 在数据库级别设置的RU(当前开发人员部署至少具有400RU)
  4. 两个集合中都需要批量插入/删除操作
  5. 用户个人资料数据(用于登录等)存储在RawDataCollection中
  6. 就服务级别而言,批量操作的优先级较低,这意味着如果执行更高优先级的任务,则可以将其搁置。
  7. 通常,用户登录时会检索少量信息。就服务水平而言,这是最高优先级。

1 个答案:

答案 0 :(得分:0)

建议不要对大容量删除操作使用存储过程。存储过程仅在主副本上运行,这意味着它们只能利用预配置的总RU / s的1/4。在Bulk Mode中使用SDK客户端进行批量操作将获得更好的吞吐量利用率和更高的效率。

是在数据库级别还是在容器级别设置吞吐量取决于几件事。如果您拥有大量获得大致相同数量的请求和存储的容器,则数据库级别的吞吐量会很好。如果请求和存储是不对称的,则为那些与其他容器有很大差异的容器提供自己的专用吞吐量。 Learn more about the differences

您不能直接限制容器上的请求。您将需要在应用程序中实现Queue-based load leveling

总体而言,如果您已预配置400 RU / s并尝试批量删除50K记录,则预配置不足,需要提高吞吐量。另外,如果您的工作负载变化很大,并且长时间很少或没有请求,而短期却很大量,那么您可能需要考虑使用Serverless throughputAutoscale