我们使用用
Linux Consumption Plan
编写的 v4
函数在 C#
实例上运行许多 Azure 函数。代码使用 GitHub Actions
进行部署,并且全部使用 Microsoft.Azure.Functions.Worker.Sdk Version 1.14.1
。
其中一个功能使用
CosmosDB Change Trigger
来激活,另一个功能使用 Timer Trigger
设置为每五分钟执行一次。
我们对这些功能的应用程序见解显示,每五分钟就会有一次
GET: {ipAddress}/metadata/instance
调用,每次调用的平均持续时间为 1.1 分钟,并且始终会导致 Cancelled
状态。
在哪里以及为何进行这些调用,可以采取哪些措施来避免这种情况?看起来这会给服务增加不必要的开销?
此调用由 Azure Cosmos DB SDK 进行,用于捕获 Azure VM 元数据信息。参考:https://learn.microsoft.com/azure/virtual-machines/instance-metadata-service?tabs=windows
此调用是在客户端初始化期间进行的,对于 Cosmos DB 客户端来说,故障并不严重。目的是,对于出现问题并发出遥测数据的情况,它会添加诸如 Azure VM 的位置之类的信息,并帮助识别您拥有多个客户端实例的情况。 这里重要的部分是,这应该只发生在
客户端初始化期间。 CosmosDBTrigger 创建客户端一次并重用它,如果您每 5 分钟看到一次,这意味着:
您正在使用 Azure Functions 消耗计划,在一段时间不活动后,Functions 运行时正在终止该函数。因此每当有新的变化时,运行时就会重新启动,因此需要创建一个新的客户端。参考:CosmosClient
https://learn.microsoft.com/azure/azure-functions/manage-connections?tabs=csharp#static-clients。如果这是您的情况,我建议您查看这个利用 Azure Functions 依赖注入生成 Singleton CosmosClient 的示例项目:https://github.com/Azure/azure-cosmos-dotnet-v3/tree/master /Microsoft.Azure.Cosmos.Samples/用法/AzureFunctions