【问题标题】:Keeping controllers warm in ASP.NET Core Web API project在 ASP.NET Core Web API 项目中保持控制器温暖
【发布时间】:2018-11-29 08:28:28
【问题描述】:

我注意到一段时间后,我的 ASP.NET Core Web API 服务似乎经历了与您重新启动它们时相同的初始化过程,即初始请求很慢,但后续请求很快。

是否有一种常见的技术可以让控制器保持温暖,这样就不会发生这种情况?作为参考,我没有使用 IIS(据我所知),这些服务使用 Microsoft 的官方 .NET Core docker 映像(不是基于 Alpine)在 Docker 中运行。

我还应该指出,这些服务中的控制器在启动时通过 /ready 端点进行预热,Kubernetes 调用该端点作为准备检查。问题是这似乎并没有持续多久。

【问题讨论】:

  • 慢有多慢?快有多快?快变慢需要等多久?您是在单个客户端上还是在多个客户端上看到它?可能与 DNS 有关吗?
  • 我不确定是否使用 microsoft docker,但如果您使用 IIS,可以参考此链接 stackoverflow.com/questions/21150237/…。也许您可以在您的应用程序中找到一些类似的设置
  • 如果你能提供一个minimal reproducible example 这样我们就可以看到有问题的控制器及其依赖关系了。
  • @mjwills 还没有,但是我仔细检查了 Npgsql 文档并注意到默认情况下它会在 5 分钟后关闭空闲连接,所以我认为这可能是根本原因。需要配置文件才能确认。
  • 这不只是因为原生 C# JIT 编译器吗?

标签: c# .net asp.net-web-api


【解决方案1】:

这听起来绝对不像是控制器问题。控制器通常是每个请求的新实例。当您在评论中提到 "slow -> 8 seconds, fast -> 300ms" 时,这绝对与 Kestrel 或控制器无关。

您的问题可能有很多,但这里有几个猜测:

  • 如果您在 Windows 中运行您的应用程序(如 Azure 应用程序服务),那么它在 IIS 下运行。您可能需要检查 IIS 和托管设置。如果它是“廉价”层,某些主机会暂停您的 Web 服务。

  • "slow -> 8 seconds" 老实说,这听起来像是您的外部呼叫速度很慢。也许是 Db、外部 API 或重新认证的东西。

【讨论】:

    【解决方案2】:

    如果您的这种体验出现在您的开发盒/个人机器中,并且当您在每次开始调试或运行应用程序时体验到这种情况时,它可能会发生。但在实时情况下,情况肯定不是这样(除了第一次运行或在应用程序池被回收或服务实例重新启动之后)。即使那样,在服务器中,这种差异也应该非常小。使用 .net 核心,它应该是最小的延迟体验。

    【讨论】:

      猜你喜欢
      • 2019-01-17
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 2022-01-27
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多