performance - 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 的初始连接?
或者,如果我们需要更快的响应时间,您是否认为我们需要增加功能保持在线的时间?
解决方案
这是预期的行为,请参阅https://youtu.be/McZIQhZpvew?t=850。
客户端的第一个请求需要经过一个预热步骤。此热身包括获取帐户信息、容器信息、路由和分区信息,以便知道将请求路由到哪里(正如您所经历的,进一步的请求不会获得这种额外的延迟)。因此维护单例实例的重要性。
在某些功能计划(消费)实例中,如果没有活动,则会取消配置,在这种情况下,客户端的任何现有实例都会被销毁,因此当配置新实例时,您的第一个请求将支付此预热成本。
目前我知道 Java SDK 中没有解决方法,但这不应该影响您的 P99 延迟,因为它只是冷客户端上的第一个请求。
希望这个和视频对原因有所帮助。
推荐阅读
- python - Python3 - 将列表传递给函数
- netbeans-9 - Netbeans 9 的本地帮助在哪里
- git - 如何通过删除 size-hungry 分支来减小远程仓库的大小?
- c# - 在我的控制台清单应用程序中添加 update () 方法时遇到问题
- verilog - 为什么非法引用网络“portA”
- java - 覆盖 application.yml 文件中的默认值 spring boot
- oracle - 关于 Oracle 中的准确时间
- powerbi - DAX 计算度量不受表中行的影响
- azure - 如何检索 Azure 逻辑应用的版本历史信息和运行历史
- powershell - 无法将 DateTime 传递给类方法 - 强制错误