以消费计划运行的 Azure Functions 在函数有一段时间没有运行时会冷启动,我认为是在 20 分钟后。它对客户端的额外延迟大约为 10-20 秒。
我想知道这个冷启动是否针对每个客户?我的意思是如果一个函数已经由客户端 1 运行,然后另一个客户端 2 再次运行它,客户端 2 是否也会冷启动?
如果没有,我想如果我有客户整天连续使用我的功能,那么根本不会有冷启动(当然只有第一个客户除外)?然后冷启动对于大量使用的应用程序来说不会成为问题。
以消费计划运行的 Azure Functions 在函数有一段时间没有运行时会冷启动,我认为是在 20 分钟后。它对客户端的额外延迟大约为 10-20 秒。
我想知道这个冷启动是否针对每个客户?我的意思是如果一个函数已经由客户端 1 运行,然后另一个客户端 2 再次运行它,客户端 2 是否也会冷启动?
如果没有,我想如果我有客户整天连续使用我的功能,那么根本不会有冷启动(当然只有第一个客户除外)?然后冷启动对于大量使用的应用程序来说不会成为问题。
冷启动是针对每个Function App 实例,而不是针对每个用户。当应用程序由于没有使用而关闭时,就会发生冷启动。就像我们也可以在 IIS 上运行的 ASP.NET Web 应用程序中看到的那样。
有关不同托管计划的冷启动行为的信息,请参阅Azure Functions 托管选项 - 冷启动行为。
对于消费计划,冷启动行为如下:
应用程序在空闲时可能会缩放到零,这意味着某些请求在启动时可能会有额外的延迟。消费计划确实有一些优化来帮助减少冷启动时间,包括从已经运行函数宿主和语言进程的预热占位符函数中提取。
以下摘自文章了解无服务器冷启动。这篇文章有点旧,但仍然相关。
从广义上讲,冷启动是一个术语,用于描述未使用的应用程序启动时间较长的现象。在 Azure Functions 的上下文中,延迟是用户必须等待其函数的总时间。从事件发生开始启动函数直到该函数完成对事件的响应。所以更准确地说,冷启动是增加最近未调用的函数的延迟。在专用计划中使用 Azure Functions 时,Functions 主机始终在运行,这意味着冷启动并不是真正的问题。因此,我们的范围缩小到运行无服务器消费模型的函数。让我们更深入。
Azure 会从暖工作器池中将预配置的服务器分配给你的应用程序。此服务器上已经运行了 Functions 运行时,但它不是专用的。
通过以特定于您的应用程序的方式配置 Functions 运行时,此工作器变得专业化。做这个专业化时发生了一些事情,包括:
Functions 运行时重置,并且任何需要的扩展都加载到 worker 上。为了确定要加载哪些扩展,运行时读取函数应用中任何函数的 function.json 文件。例如,如果您使用的是 Durable Functions,或者您有输入或输出绑定,就会发生这种情况。
函数本身由语言提供程序加载到内存中。根据应用程序的大小,这将花费不同的时间。
您的代码运行。
编辑:
编辑 2:
例如,如果我有一个具有 100 个功能的应用程序,冷启动是否会比具有 10 个功能的应用程序更长,
这取决于。一般来说,我的回答是肯定的,因为您可能会有更多的依赖项、更多要连接的外部资源以及要加载的整体代码。但是如果你保持依赖树很小,应该不会有太大的差异。
摘自我之前提到的文章的编写轻量级代码章节:
依赖项:当您部署代码时,您的依赖项将作为文件添加到您的应用程序中。[...] 您的应用程序所需的所有代码最终都会加载到内存中,这对于较大的应用程序需要更长的时间。因此,如果您有大量依赖项,您将获得更长的冷启动,因为从 Azure 文件执行 I/O 操作的时间增加,并且将更大的应用程序加载到内存中需要更长的时间。[...]
高效代码:有时答案只是编写更高效的代码。这里有一些方法需要注意,首先尝试使尽可能多的处理异步。如果您有一个重量级的同步调用阻止您的代码完成,则函数将无法正常执行。按照这种思路,尽量减少在代码启动之前必须发生的工作量,并避免使用消耗大量 CPU 的代码。[...]