另一个区域中使用Azure函数的CosmosDB响应缓慢



我在英国,需要从澳大利亚的CosmosDB获取数据。容器大小不是问题。只有3张唱片。重点是:很明显,问题是延迟不仅涉及距离,还涉及两个azure区域之间的网关。

通过研究,我发现了一些可以帮助我的东西:直接连接而不是网关。但我发现的例子无法解释如何指定使用TCP而不是HTTPS 的协议

CosmosClientOptions cco = new CosmosClientOptions()
{
SerializerOptions = new CosmosSerializationOptions()
{
PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
},
ConnectionMode = ConnectionMode.Direct
};
CosmosClient c = new CosmosClient(
Environment.GetEnvironmentVariable($"CosmosDb_{thisEnv}_{reg}_url"),
Environment.GetEnvironmentVariable($"CosmosDb_{thisEnv}_{reg}_ClientSecret"),
cco);

我正在使用Microsoft.Azure.Cosmos,但我在该页上找到了示例https://github.com/Azure/azure-cosmos-dotnet-v2/issues/194这看起来像是一个不同的图书馆,我看到了:

ConnectionPolicy connectionPolicy = new ConnectionPolicy
{
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Protocol.Tcp
};
this.documentDbClient = new DocumentClient(
new Uri(documentDbEndpointUrl),
documentDbAuthKey,
connectionPolicy
);

第一个问题:当我设置ConnectionMode=ConnectionMode.Direct时,这会自动将我的协议设置为TCP吗?我没有注意到它的性能有任何改善。所以,我不确定。

是的,我真的需要访问不同地区的数据,我知道微软建议不要这样做

在问题和评论中有一些东西需要解释。

英国和澳大利亚两个地区之间的延迟平均约为250毫秒。在任何情况下,对延迟的任何测量都需要对此进行折扣。请注意,这些是30天内的平均值。具有更大延迟的尖峰并不罕见。如果您正在构建的任何部分对代码中的瞬态错误处理(即重试(具有延迟敏感性,则需要考虑这一点。有关Azure WAN中延迟的更多信息,请参阅Azure网络往返延迟统计

您正在使用.NET v3 SDK。直接模式是默认设置的。你什么都不需要做。也就是说,它只会对这两个区域之间的延迟产生轻微影响,甚至可能没有影响。

对Cosmos DB服务的第一个请求将始终包括由于握手和其他初始化而导致的更大延迟,这些初始化是在与服务建立新连接时发生的。后续请求不会产生这种延迟。

了解使用基于消费的Azure功能与应用程序计划(高级(功能之间的权衡是很重要的。前者可能由于实例回收而导致意外延迟。

实现很简单,这取决于您要做什么。如果您只是在数据库上构建一个rest API,那么http函数就会起作用。Cosmos DB也有内置的触发器和绑定。这个来自Cosmic Works GitHub repo的示例展示了如何实现更改提要处理器来响应容器中的更改。但同样的代码适用于如何为任何类型的Azure函数初始化Cosmos资源。

最新更新