通过HTTP调用Azure功能150次会导致异常

问题描述 投票:4回答:1

我在Azure上运行asp.net mvc Web App。在一个方法中,我对Azure Function Web API进行了几次HTTP调用。在这个Azure函数中,我使用DbContext将新记录插入数据库。

// Method in web application making http requests to azure function web api
public async Task CreateRecords() {
    int amountOfCalls = 150;
    var allTasks = new List<Task<HttpResponseMessage>>();

    for (int i = 0; i < amountOfCalls; i++) {
        var task = HttpClientInstance.Instance.PostAsync(<uri>, new StringContent(i.ToString()));
        allTasks.Add(task);
    }

    await Task.WhenAll(allTasks); // Gives an exception
}

amountOfCalls设置为25,50或100时,一切都很好。但是,当我将amountOfCalls设置为150时,最初它会将一些记录插入到数据库中,但最终会导致错误:

无法连接到远程服务器。

所以首先我认为它必须是Azure sql数据库的最大并发登录。所以我将那个升级到定价等级S9(1600 DTU的最多3200个并发登录记录为here)。

但这并没有解决问题。然后我开始远程调试Azure功能。并且它不会在Azure功能本身中提供异常。因此,下一步是研究Application Insights。我看到DbContext的构造函数给出了一个异常(不幸的是没有堆栈跟踪):

type:System.InvalidOperationException

方法:WebApp.DataAccess.PocDbContext..ctor

requestName:InsertRecordFunction

requestDuration:54,643.2201

Azure Function看起来像这样:

[DependencyInjectionConfig(typeof(DependencyConfig))] // Autofac
public static class InsertRecordFunction
{
    [FunctionName("InsertRecordFunction")]
    public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post", Route = "InsertRecordFunction")]HttpRequestMessage req,
        TraceWriter log,
        [Inject]IRecordDataService recordDataService)
    {
        log.Info("InsertRecordFunction was triggered by Http.");
        try {
            await recordDataService.AddRandomRecordAsync();
        }
        catch (Exception ex) {
            return req.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
        }

        return req.CreateResponse(HttpStatusCode.OK);
    }

PocDbContext的演员看起来像这样:

public PocDbContext() : base("DefaultConnection") {
    Database.SetInitializer<PocDbContext>(null);
}

我仍然觉得它与连接池到Azure sql数据库有关。在这个问题之前,我遇到另一个告诉我将执行策略设置为SqlAzureExecutionStrategy(我做了this way)。

使用(静态)HttpClient从Azure Web App进行的Web api调用是否存在某种最大值?我还能做些什么来找出确切的例外情况?谢谢。

更新

在Application Insights中,我找到了有关异常的其他信息:

超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。

升级Azure sql数据库的定价层后,不是我所期望的。

c# asp.net-mvc azure-web-sites azure-functions dotnet-httpclient
1个回答
3
投票

来自ADO.NET的文档,它是实体框架(SQL Server Connection Pooling (ADO.NET))的基础:

默认情况下,在ADO.NET中启用连接池。除非您明确禁用它,否则在您的应用程序中打开和关闭连接时,池会优化连接。

Adding Connections部分稍微向下:

根据需要将连接添加到池中,直到指定的最大池大小(默认值为100)。

因此,明确地将连接字符串Max Pool Size设置为> = 150应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.