You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用托管身份认证Azure存储与服务总线性能慢于连接字符串

托管身份认证导致Azure Function性能下降的原因及解决方法

核心问题分析

你遇到的性能差异主要来自托管身份认证的令牌获取开销以及Azure SDK客户端未复用两个关键点:

  1. 每次调用重复初始化客户端引发的认证冗余
    托管身份版本代码中,每次函数触发都会新建DefaultAzureCredential和BlobServiceClient实例。DefaultAzureCredential首次初始化时会遍历多个身份提供者(环境变量、托管身份、开发工具等)获取令牌,这个过程会产生额外网络请求与延迟;同时,每次新建BlobServiceClient会导致令牌无法被缓存,每一次Blob操作都需要重新请求令牌,进一步增加耗时。
    而连接字符串版本直接使用共享密钥认证,无需额外令牌请求步骤,性能自然更优。

  2. 双重认证请求的延迟叠加
    托管身份版本中,Service Bus触发器本身需要通过托管身份获取令牌接收消息,再加上Blob存储的令牌请求,两次认证的网络延迟叠加,进一步拉大了与连接字符串版本的性能差距。

解决方案

1. 复用Azure SDK客户端实例

Azure SDK的客户端(如BlobServiceClient、ServiceBusClient)均设计为单例复用模式,复用实例可自动缓存令牌,避免重复认证请求。

修改方式(以Isolated Worker模型为例,在Program.cs中配置依赖注入):

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults()
    .ConfigureServices(services =>
    {
        services.AddSingleton<IBlobServiceClient>(sp =>
        {
            var config = sp.GetRequiredService<IConfiguration>();
            var storageAccount = config["StorageAccount"];
            var blobUri = new Uri($"https://{storageAccount}.blob.core.windows.net/");
            // 直接使用ManagedIdentityCredential减少身份提供者遍历开销
            return new BlobServiceClient(blobUri, new ManagedIdentityCredential());
        });
    })
    .Build();

host.Run();

在函数类中注入复用的客户端:

private readonly IBlobServiceClient _blobServiceClient;

public YourFunctionClass(IBlobServiceClient blobServiceClient)
{
    _blobServiceClient = blobServiceClient;
}

[FunctionName("TestFuncWithManagedIdentity")]
public async Task Run(
    [ServiceBusTrigger("testmanagedidentity", Connection = "SBNamespaceFQName")] ServiceBusReceivedMessage message,
    ServiceBusMessageActions messageActions)
{
    var blobContainerClient = _blobServiceClient.GetBlobContainerClient("containerName");   
    var blobClient = blobContainerClient.GetBlobClient("XXX");
    var blobMessage = await blobClient.DownloadAsync();

    await messageActions.CompleteMessageAsync(message);
}

2. 精简认证流程

用ManagedIdentityCredential替代DefaultAzureCredential,因为你的场景明确使用托管身份,直接指定认证方式可避免DefaultAzureCredential对其他认证途径的无效尝试,减少额外开销。

3. 定位具体瓶颈(可选)

通过Application Insights查看函数调用的详细耗时分布,确认是令牌获取阶段还是Blob下载阶段的延迟占比更高,以便针对性优化。

内容的提问来源于stack exchange,提问作者Inako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 14:02:54