Azure Functions 是否为每个客户端冷启动?

Are Azure Functions cold starts for each client?

运行 消费计划中的 Azure Functions 在函数 运行 有一段时间没有使用时会冷启动,我认为是在 20 分钟后。客户端的额外延迟大约为 10-20 秒。

我想知道这个冷启动是否是针对每个客户的? 我的意思是,如果一个函数由客户端 1 运行,然后另一个客户端 2 运行 再次调用它,那么客户端 2 是否也会冷启动?

如果不是,我想如果我有客户整天不断地使用我的功能,那么根本就没有冷启动(当然除了第一个客户)?然后冷启动对于大量使用的应用程序来说将不是问题。

冷启动是针对每个 Function App 实例,而不是针对每个用户。当应用程序因不使用而关闭时,就会发生冷启动。就像我们也可以在 ASP.NET Web 应用程序 运行ning on IIS 中看到的那样。

有关不同托管计划的冷启动行为的信息,请参阅Azure Functions hosting options - Cold start behavior

对于消耗计划,冷启动行为如下:

Apps may scale to zero when idle, meaning some requests may have additional latency at startup. The consumption plan does have some optimizations to help decrease cold start time, including pulling from pre-warmed placeholder functions that already have the function host and language processes running.

以下内容摘自文章Understanding Serverless cold start。这篇文章有点旧,但仍然相关。

什么是冷启动?

从广义上讲,冷启动是一个术语,用于描述未使用的应用程序需要较长时间才能启动的现象。在 Azure Functions 的上下文中,延迟是用户必须等待其函数的总时间。从一个事件恰好启动一个函数,直到该函数完成对事件的响应。因此,更准确地说,冷启动是最近未被调用的函数的延迟增加。在专用计划中使用 Azure Functions 时,Functions 主机始终 运行ning,这意味着冷启动并不是真正的问题。因此,我们的范围缩小到 Functions 运行ning 无服务器消费模型。让我们更深入。

冷启动期间会发生什么

  1. Azure 会从温暖的工作人员池中为您的应用程序分配一个预配置的服务器。此服务器上已有 运行time 运行ning 功能,但未专门化。

  2. 此工作人员通过以特定于您的应用程序的方式配置函数 运行time 变得专业化。进行此专业化会发生一些事情,包括:

    • Azure Functions 基础结构将您的 Azure 文件内容装载到分配给您的工作人员
    • 特定于您的函数应用的应用设置应用于工作器
  3. 函数 运行时间重置,任何需要的扩展都加载到工作器上。为了确定要加载哪些扩展,运行time 读取函数应用程序中任何函数的 function.json 文件。例如,如果您使用 Durable Functions,或者如果您有输入或输出绑定,就会发生这种情况。

  4. 函数本身由语言提供者加载到内存中。根据您的应用程序的大小,这将花费不同的时间。

  5. 你的代码运行s.

编辑:

  1. 如果我的应用程序中有多个功能,每个功能是否都有自己的冷启动,还是整个应用程序都是一个冷启动?
    冷启动是Function App级别的,不是个别Function级别的。
  2. 据此我猜想我的假设是正确的,冷启动对于频繁使用的应用程序来说是没有问题的,对吧?
    没错。
  3. 是否保证运行一个函数的两个客户端使用同一个函数app实例?还是由于某些原因可能存在不同的实例,从而导致两个客户端冷启动?
    Azure Functions 根据负载进行缩放。如果负载增加,您将获得额外的实例。当然,那些额外的实例有自己的(冷)启动。
    因此:如果负载适合一个实例,则所有执行都 可能 在同一个实例上。如果存在多个实例,则无法说明请求将在哪里结束。

编辑 2:
例如,如果我有一个具有 100 个功能的应用程序,冷启动是否会比具有 10 个功能的应用程序更长
这取决于。总的来说,我的回答是肯定的,因为您可能会有更多的依赖项、更多的外部资源需要连接以及总体上有更多的代码需要加载。但是如果你保持依赖关系树很小,应该不会有太大的差异。

摘自我之前提到的文章的编写轻量级代码一章:

Dependencies: When you deploy your code, your dependencies are added as files to your application. [...] all code needed by your app eventually gets loaded into memory, which takes longer with a larger application. So, if you have a ton of dependencies, you’ll get a longer cold start due to increased time for I/O operations from Azure Files, and longer time needed to load a bigger app into memory. [...]

Efficient Code: Sometimes the answer is simply writing more efficient code. There are a few approaches to note here, first try to make as much processing as possible asynchronous. Functions won’t perform well if you have a heavyweight synchronous call blocking your code from completing. Along this vein, try to minimize the amount of work that has to happen before your code starts up and avoid code which consumes a lot of CPU. [...]