gpt4 book ai didi

c# - Azure Functions DbContext 请求延迟 - 在启动时连接到数据库?

转载 作者:行者123 更新时间:2023-12-03 03:30:51 25 4
gpt4 key购买 nike

我有一个 Azure Functions 应用程序,我正在尝试尽可能消除请求中的延迟。为了应对冷启动时间,我们升级了 Azure Functions 计划,以确保我们通常有一个或多个预热实例可供使用。

但是,即使使用预热的实例,对新启动的函数的第一次 HttpTrigger 调用也会出现延迟,因为它需要建立与数据库的连接。似乎在实例化 DataContext 之前不会建立数据库连接,而在实例化 DataContext 之前,数据库连接不会发生,直到 HttpTrigger 需要它为止。在向数据库发出第一个请求之后,一切都非常高效。

我使用依赖注入(inject)在 FunctionsStartup 类中创建 DbContextPool:

services.AddDbContextPool<DataContext>(options => { 
options.UseSqlServer(connectionString);
});

我知道建立数据库连接自然需要一点时间,但是有什么方法可以让 Azure Functions 在启动时启动其连接池,而不是等到第一个 HttpTrigger 实例化我的 DbContext 并连接到数据库?

最佳答案

感谢this answer,我能够找到解决方案。该解决方案的优点在于,它不仅适用于预热数据库/DbContext 连接,而且可用于预热各种连接(例如,存储帐户、Key Vault 访问等)。

using System;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Config;
using Microsoft.Azure.WebJobs.Hosting;
using Microsoft.Extensions.DependencyInjection;

[assembly: WebJobsStartup(typeof(MyCompany.MyProduct.MyFunctionAppInitializer), "MyFunctionAppInitializer")]

namespace MyCompany.MyProduct;

public class MyFunctionAppInitializer : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
builder.AddExtension<MyFunctionAppInitializerConfigProvider>();
}
}

internal class MyFunctionAppInitializerConfigProvider : IExtensionConfigProvider
{
private readonly IServiceScopeFactory scopeFactory;

public MyFunctionAppInitializerConfigProvider(IServiceScopeFactory scopeFactory)
{
this.scopeFactory = scopeFactory;
}

public void Initialize(ExtensionConfigContext context)
{
using IServiceScope scope = scopeFactory.CreateScope();
Task preWarmTask = PreWarmConnections(scope.ServiceProvider);
preWarmTask.Wait();
}

private static async Task PreWarmConnections(IServiceProvider serviceProvider)
{
// Connect to Database
var dbContext = serviceProvider.GetService<MyDbContext>();
await dbContext.PingDatabase();

// Connect to Storage Access
await MyStorageAccess.PingStorageAccess();

// Connect to Signing Key Vault
MyAuthorization.InitializeCryptoClient();
}
}

作为一点背景知识:如果您像我一样,第一次尝试将 DbContext 实例化/连接放在 Startup 类中,您很快就会发现遇到各种崩溃错误(当您尝试将其部署到您的 Function 环境时,通常与日志记录相关。这是因为 Function App 尚未在该类的 Configure() 方法中完全初始化。

但是,使用 WebJobStartup 调用似乎是在一切都完全初始化之后发生的,但仍然是在实例启动时发生的。在实践中,这使我能够获得所需的所有连接,以便向我的 Function 应用程序发出的请求非常敏捷。

关于c# - Azure Functions DbContext 请求延迟 - 在启动时连接到数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74801947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com