首页 > 解决方案 > Azure Cosmos db:批量删除记录时请求超出速率限制

问题描述

我有一位用户使用存储过程从一个容器中批量删除了大约 50K 文档。

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

在这种情况下,为了避免上述服务短缺,最佳实践应该是什么?

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

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

  1. 两个集合:RawDataCollection 和 TransformedDataCollection
  2. 分区键值是客户帐号
  3. RU 在数据库级别设置(当前开发部署至少有 400RU)
  4. 两个集合都需要批量插入/删除操作
  5. 用户配置文件数据(用于登录等)存储在 RawDataCollection
  6. 批量操作在服务级别方面是低优先级的,这意味着如果有更高优先级的任务进入,它可能会被搁置或发生其他事情。
  7. 通常当用户登录时,检索少量信息。就服务水平而言,这是高度优先的。

标签: azureazure-cosmosdb

解决方案


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

是在数据库级别还是容器级别提供吞吐量取决于几件事。如果您有大量容器获得大致相同数量的请求和存储,那么数据库级别的吞吐量就可以了。如果请求和存储是不对称的,那么为那些与其他容器有很大差异的容器提供自己的专用吞吐量。了解有关差异的更多信息

您不能直接限制容器上的请求。您需要在应用程序中实现基于队列的负载均衡。

总体而言,如果您已配置 400 RU/s 并尝试批量删除 50K 记录,则您的配置不足,需要增加吞吐量。此外,如果您的工作负载变化很大,长时间的请求很少或没有请求,而短时间的请求量很大,您可能需要考虑使用无服务器吞吐量Autoscale


推荐阅读