azure - Cosmos DB - Microsoft.Azure.Documents.AddressResolver.EnsureRoutingMapPresent

标签 azure azure-cosmosdb

作为数据迁移的一部分,我在 Cosmos DB 方面遇到了一些奇怪的问题。迁移包括删除并重新创建我们的生产集合,然后使用 Azure Cosmos DB 迁移工具从我们的开发集合中复制文档。 我想要完全清除生产集合中已有的数据,而不是复制顶部的新文档,因此为了实现这一目标,我执行了以下过程......

  1. 删除了名为“Production_Products”的生产集合
  2. 使用相同的名称和分区键重新创建了 Production 集合
  3. 使用 Azure Cosmos DB 数据迁移工具,我将开发集合中的文档复制到新创建的空生产集合“Production_Products
  4. 迁移完成后,我们测试了网站,但不断收到以下错误......

    Microsoft.Azure.Documents.NotFoundException: at Microsoft.Azure.Documents.AddressResolver.EnsureRoutingMapPresent

这非常令人困惑,因为我们可以毫无问题地从 Azure 查询数据。多个应用程序重新启动并检查配置后,我们创建了一个新集合“Production_Products_Test”并重复迁移步骤。

这工作得很好。当天晚些时候,我们通过使用原始名称“Production_Products”重新创建一个新集合来恢复更改,但失败了。我们必须恢复使用“_Test”集合。

任何人都可以深入了解为什么会发生这种情况吗?

最佳答案

基于评论。

DocumentClient 维护地址缓存,如果您在外部删除并重新创建集合(不是通过 DocumentClient 或至少不是通过特定的 DocumentClient 实例,因为您描述了许多服务),可能出现的问题是地址该实例拥有的缓存无效。较新版本的 SDK 包含会使用react并刷新缓存的修复程序(请参阅此处的更改日志 https://learn.microsoft.com/azure/cosmos-db/sql-api-sdk-dotnet)。

SDK 2.1.3 相当旧(超过 2 年),建议更新它(2.10.3 是目前​​最新的)。

这些缓存失效的原因是,当您删除并重新创建时,新集合具有不同的 ResourceId .

话虽如此,有一种情况不容易修复,那就是当您删除并重新创建集合时,您的代码使用 ResourceIds(例如,使用 SelfLinks)而不是名称/ids进行操作。在这些情况下,如果您正在缓存或保存对先前集合的 ResourceId 的引用,这些请求将会失败。相反,您需要通过 UriFactory 使用名称/ID .

通常在这些情况下,了解异常的完整堆栈跟踪(而不仅仅是类型名称)有助于了解到底发生了什么。

关于azure - Cosmos DB - Microsoft.Azure.Documents.AddressResolver.EnsureRoutingMapPresent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61528132/

相关文章:

mysql - Azure 数据工厂中复制期间的数据转换

Azure 公钥解释了吗?

azure - 如何使用 ADAL for Angular 将用户信息传递回服务器端

azure - Cosmos DB - 在Where条件中使用嵌套查询输出

azure - 如何使用 R 中的 API 使用 Azure DocumentDB 中的数据

asp.net-mvc - Azure、数据库和上传文档

c# - 我的 webrole.cs 似乎找不到连接字符串

Azure documentdb 防火墙阻止了来自 Web 作业的访问

azure - 如何在 CosmosDB SqlAPI 中使用破折号查询属性?

azure - CosmosDB 在读取时从外部 API 返回数据