首页 > 解决方案 > Azure Functions - Java CosmosClientBuilder 初始连接速度慢

问题描述

我们将 Azure Cloud Functions 与 Java SDK 结合使用,并使用以下 Java API 连接到 Cosmos DB

CosmosClient client = new CosmosClientBuilder()
                .endpoint("https://my-cosmos-project-xyz.documents.azure.com:443/")
                .key(key)
                .consistencyLevel(ConsistencyLevel.SESSION)
                .buildClient();

此 buildClient() 启动到 CosmosDB 的连接,这需要 2 到 3 秒。使用该客户端的后续数据库查询速度很快。
只有第一次连接设置很慢。

我们将 CosmosClient 保留为静态变量,因此我们可以在发送到我们函数的多个 http 请求之间重用它。

但是一旦函数变冷(当 Azure 在几分钟未使用后将其关闭时),静态变量会丢失并在函数再次启动时重新连接。

有没有办法更快地建立与 cosmos DB 的初始连接?

或者,如果我们需要更快的响应时间,您是否认为我们需要增加功能保持在线的时间?

标签: performanceazure-functionsazure-cosmosdbazure-java-sdk

解决方案


这是预期的行为,请参阅https://youtu.be/McZIQhZpvew?t=850

客户端的第一个请求需要经过一个预热步骤。此热身包括获取帐户信息、容器信息、路由和分区信息,以便知道将请求路由到哪里(正如您所经历的,进一步的请求不会获得这种额外的延迟)。因此维护单例实例的重要性。

在某些功能计划(消费)实例中,如果没有活动,则会取消配置,在这种情况下,客户端的任何现有实例都会被销毁,因此当配置新实例时,您的第一个请求将支付此预热成本。

目前我知道 Java SDK 中没有解决方法,但这不应该影响您的 P99 延迟,因为它只是冷客户端上的第一个请求。

希望这个和视频对原因有所帮助。


推荐阅读