使用备用RU删除Cosmos DB中的项目



我们使用Cosmos DB来跟踪我们的所有设备,与设备相关的数据(未存储在设备文档中(也存储在具有相同分区ID的同一容器中。

设备文档和相关文档都具有/deviceId作为分区密钥。删除设备后,我会删除设备文档。我实际上想删除整个分区,但这似乎不可能。因此,我将返回到一个查询具有该分区键的所有项的查询,并将它们从数据库中删除。

这很好,但如果有大量相关数据(在某些情况下可能是真的(,可能会消耗大量RU。我宁愿删除设备,并计划稍后删除所有相关数据(在数据库中保存一段时间不会有什么坏处(。当RU利用率低时,我开始删除这些项目。有标准的解决方案吗?

最好的解决方案是调度这个命令,当Cosmos DB有空闲的RU时,它会处理这些命令,就像TTL删除一样。这可能吗?

现在预览了一个功能,可以使用fire-and-forget后台处理模型,在有限的可用吞吐量下,通过分区键删除所有项目。在功能请求页面中有一个注册链接,可以访问预览。

目前,API在SDK中看起来像是一个新的DeleteAllItemsByPartitionKey方法。

设置一个TTL,然后让Cosmos在容器空闲时处理容器中的过期数据,这是绝对可能的。然而,首先更新文档的成本是删除文档的成本,所以你不会得到太多好处。

您建议的一种方法可能是使用一个单独的容器(甚至是一个队列(,在其中插入一个具有deviceId的新项目以退出。然后在晚上或在您知道系统空闲的时候。运行一个作业,读取队列中的下一个设备ID,查询具有该分区键的所有项目,然后删除数据或设置TTL以使数据过期。

有一个功能可以删除工作中的整个分区,这将非常适合这种情况(事实上,它是为它设计的(,但没有可用性的ETA。

最新更新