gpt4 book ai didi

c# - Entity Framework Core 3.1.3 在 AWS Lambda 函数和 AWS API Gateway 无服务器 API 中使用的第一个查询非常慢

转载 作者:行者123 更新时间:2023-12-04 11:33:46 31 4
gpt4 key购买 nike

我有一个 AWS API 网关,它代理多个 AWS Lambda 函数。这些函数从 PostgreSQL 数据库 (AWS Aurora PostgreSQL) 读取和写入。我已经使用 Entity Framework Core Database First 连接了数据访问。我有一个问题,在几分钟后我第一次调用我的 API 并执行 Lambda 函数时,通过 EF Core 对数据库的第一次查询最多需要 29 秒(!)。下一个只在 1 秒后执行,只需要 200 毫秒。

我知道你在想什么,这是 Lambda 冷启动。好吧,我已经排除了这一点,因为如果我取出任何 EF Core 代码,并让我的函数返回一个虚拟响应,时间会下降到大约 4 秒响应,然后如果我再次调用 200 毫秒之后。

如果我检查我的函数的日志,我还可以看到延迟发生在执行第一个 EF Core 查询时,在此之前的其他事件发生得非常快。请参阅下面的摘录。

“找到测试客户”是从查询中第一次从数据库返回数据。请参阅下面的摘录:

            using (var loyalty = new loyaltyContext())
{
var testArray = new string[]
{Customer.CustomerStateReasonCodes.Deceased,
Customer.CustomerStateReasonCodes.Fraud};

var dupeEmailCustomers = (from c in loyalty.ContactInformation
where c.ContactType == "EMAIL"
join cu in loyalty.Customer on c.CustomerInternalId equals cu.CustomerInternalId
where cu.Status == Customer.CustomerStates.Active
select c).AsNoTracking()
.Union(from c in loyalty.ContactInformation
where c.ContactType == "EMAIL"
join cu in loyalty.Customer on c.CustomerInternalId equals cu.CustomerInternalId
where cu.Status != Customer.CustomerStates.Active &&
testArray.Contains(cu.StatusReason)
select c).AsNoTracking();

foreach (var cust in dupeEmailCustomers)
{
context.Logger.LogLine($"Found test customer {JsonConvert.SerializeObject(cust)}");
}
}

这是 Lambda 执行日志:

enter image description here

注意从 9:26 秒到 9:44 秒的跳跃。这就是数据库和返回的旅程。现在,如果我之后再次调用相同的 API,它会在亚秒内发生。我假设这是 EF Core。我的问题是我不确定在 AWS Lambda 的架构中,我如何能够减少第一次查询延迟。我已经为 AWS Lambda 启用了预配置并发,据说它可以使包含我的代码的容器实例保持“温暖”并准备好运行,但没有任何区别。

我怀疑这是因为 Lambda 代码中唯一保持温暖的部分是在 lambda 处理程序之外运行的东西。 EF Core 查询仅发生在我的处理程序中,例如在我的:
    public APIGatewayProxyResponse PostCustomerProxyResponse(APIGatewayProxyRequest request, ILambdaContext context)

我相信唯一通过提供的并发保持“温暖”的代码是构造函数中发生的,例如
public Functions()
{
_jSchema = new JSchemaGenerator().Generate(typeof(CustomerPayload));
_systemsManagementClient = new AmazonSimpleSystemsManagementClient(RegionEndpoint.APSoutheast2);

SecurityKey = PopulateParameter(ParameterPath + Integration + JWT + "/secret", true);
Issuer = PopulateParameter(ParameterPath + Integration + JWT + "/issuer", false);
ClaimName = PopulateParameter(ParameterPath + Integration + JWT + "/claim", false);
ScpiUser = PopulateParameter(ParameterPath + Integration + SCPI + "/user", false);
ScpiPassword = PopulateParameter(ParameterPath + Integration + SCPI + "/password", true);
//DbUser = PopulateParameter(ParameterPath + ParameterPathDatabase + "/iamuser", false);
}

我尝试向构造函数添加一个小型数据库查询,基本上是在 Entity Framework 中调用 ExecuteRawSQL() 以从 PostgreSQL 中调用“SELECT 1”,希望这可以算作第一个查询,并且我的实际 API 调用会更快,但这很失败。如果我在 Lambda 构造函数中有此“SELECT 1”代码,则在尝试调用该方法时,整个 API 实际上会超时。

我不知所措。任何人都可以提供帮助吗?我正在转储 EF Core 并返回到像 SqlKata 这样的简单查询引擎,这将是一种耻辱,因为 EF Core 中的映射和实体非常适合使用。如果有帮助,我将 Npgsql.EntityFrameworkCore.PostgreSQL 用于我的 EF Core 连接。

最佳答案

请试试这个...

var dupeEmailCustomers = ( from c in loyalty.ContactInformation
join cu in loyalty.Customer on c.CustomerInternalId equals cu.CustomerInternalId
where cu.Status == Customer.CustomerStates.Active
&& c.ContactType == "EMAIL"
select c
).AsNoTracking()
.Union(
from c in loyalty.ContactInformation
join cu in loyalty.Customer on c.CustomerInternalId equals cu.CustomerInternalId
where c.ContactType == "EMAIL"
&& cu.Status != Customer.CustomerStates.Active
&& testArray.Contains(cu.StatusReason)
select c
).AsNoTracking();

分别测试这些时间
    from c in loyalty.ContactInformation
join cu in loyalty.Customer on c.CustomerInternalId equals cu.CustomerInternalId
where cu.Status == Customer.CustomerStates.Active
&& c.ContactType == "EMAIL"
select c


    from c in loyalty.ContactInformation
join cu in loyalty.Customer on c.CustomerInternalId equals cu.CustomerInternalId
where c.ContactType == "EMAIL"
&& cu.Status != Customer.CustomerStates.Active
&& testArray.Contains(cu.StatusReason)
select c

您可能缺少索引.... 尝试在 ContactType 和 Status 上添加索引,然后在 StatusReason 上查看您是否需要一个

关于c# - Entity Framework Core 3.1.3 在 AWS Lambda 函数和 AWS API Gateway 无服务器 API 中使用的第一个查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62336039/

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