azure - Azure Cosmos db:批量删除记录时请求超出速率限制
问题描述
我有一位用户使用存储过程从一个容器中批量删除了大约 50K 文档。
同时,另一个用户正在尝试登录 Web 应用程序(连接到同一个 cosmos db),但由于超出速率限制,请求失败。
在这种情况下,为了避免上述服务短缺,最佳实践应该是什么?
a) 我应该通过收集来提供 RU 吗?b) 我可以在发出请求时设置代码中批量操作消耗的 RU 上限吗?c) 还有其他方法吗?
有关我当前(幼稚/新手)实施的更多详细信息:
- 两个集合:RawDataCollection 和 TransformedDataCollection
- 分区键值是客户帐号
- RU 在数据库级别设置(当前开发部署至少有 400RU)
- 两个集合都需要批量插入/删除操作
- 用户配置文件数据(用于登录等)存储在 RawDataCollection
- 批量操作在服务级别方面是低优先级的,这意味着如果有更高优先级的任务进入,它可能会被搁置或发生其他事情。
- 通常当用户登录时,检索少量信息。就服务水平而言,这是高度优先的。
解决方案
建议不要将存储过程用于批量删除操作。存储过程仅在主副本上运行,这意味着它们只能利用所配置的总 RU/s 的 1/4。在批量模式下使用 SDK 客户端进行批量操作时,您将获得更好的吞吐量使用率和更高的效率。
是在数据库级别还是容器级别提供吞吐量取决于几件事。如果您有大量容器获得大致相同数量的请求和存储,那么数据库级别的吞吐量就可以了。如果请求和存储是不对称的,那么为那些与其他容器有很大差异的容器提供自己的专用吞吐量。了解有关差异的更多信息。
您不能直接限制容器上的请求。您需要在应用程序中实现基于队列的负载均衡。
总体而言,如果您已配置 400 RU/s 并尝试批量删除 50K 记录,则您的配置不足,需要增加吞吐量。此外,如果您的工作负载变化很大,长时间的请求很少或没有请求,而短时间的请求量很大,您可能需要考虑使用无服务器吞吐量或Autoscale
推荐阅读
- memory-leaks - 调用 MAPIUninitialize api 后应用程序崩溃一次
- javascript - 在vue中的特定索引处返回带有过滤器对象的数组
- javascript - 从 iframe 中查找 iFrame 的托管标签
- javascript - 计算附加到 Firestore 文档的侦听器数量
- java - 在拦截器和控制器上的 Spring Boot 应用程序中读取 servlet 请求
- sql - TRIM 不会删除内部空格
- sql - 在第二列值都相同的组中查找非唯一列值的数量
- javascript - 为什么允许使用 kebab-case 非标准属性,而不允许使用其他属性?以及如何在 TypeScript 中定义这样的类型?
- reactjs - 我们如何在 redux 中改变布尔状态
- algorithm - 求所有角都为 1 的二维二进制矩阵中最大矩形的面积