Azure Functions 高级计划

Azure Functions 弹性高级计划是函数应用的一个动态缩放托管选项。 有关其他托管计划选项,请参阅托管计划文章

重要

Azure Functions 可在 Azure 应用服务平台上运行。 在应用服务平台中,托管高级计划函数应用的计划称为弹性高级计划,其 SKU 名称类似于 EP1。 如果选择在高级计划上运行函数应用,请确保创建一个 SKU 名称以“E”开头的计划,例如 EP1。 以“P”开头的应用服务计划 SKU 名称,例如 P1V2(高级 V2 小型计划),实际上是专用托管计划。 由于它们是专用计划而不是弹性高级计划,因此 SKU 名称以“P”开头的计划不会动态缩放,可能会增加你的成本。

高级计划托管为函数提供了以下好处:

就像消耗计划一样,使用高级计划时,会根据传入事件数添加和删除 Azure Functions 主机实例。 可以将多个函数应用部署到同一高级计划,该计划允许配置计算实例大小、基本计划大小和最大计划大小。

计费

高级计划的计费基于跨实例分配的核心秒数和内存。 此计费不同于消耗计划,该计划根据每秒的资源消耗量和执行次数计费。 高级计划不收取执行费用。 使用此计费方式,无论函数是活动的还是空闲的,每个活动计划的月成本都是最低的。 请记住,高级计划中的所有函数应用会共享已分配的实例。 若要了解详细信息,请参阅 Azure Functions 定价页

注意

每个高级计划在任何时候都至少有一个活动(计费)的实例。

创建高级计划

在 Azure 门户中创建函数应用时,消耗计划为默认值。 若要创建在高级计划中运行的函数应用,必须使用弹性高级 SKU 之一显式创建或选择 Azure Functions 高级托管计划。 然后,在此计划中托管你创建的函数应用。 可以使用 Azure 门户轻松地同时创建高级计划和函数应用。 可以在同一高级计划中运行多个函数应用,但它们必须在相同的操作系统(Windows 或 Linux)上运行。

以下文章说明了如何通过编程方式创建采用高级计划的函数应用:

消除冷启动

当消耗计划中没有发生任何事件或执行任何操作时,你的应用可以缩减到零个实例。 当出现新事件时,必须使运行应用的新实例专用化。 将新实例专用化需要一些时间,具体取决于应用。 第一次调用时的这种额外延迟通常称为应用冷启动。

高级计划提供了两个功能,这些功能协同工作以有效地消除函数中的冷启动:“始终就绪实例”和“预热实例”。 始终就绪实例是一类不受缩放影响的预分配实例,而预热实例是由于 HTTP 事件而进行缩放时的缓冲区。

当事件开始触发应用时,它们首先路由到始终就绪实例。 当函数因 HTTP 事件而变为活动状态时,其他实例将作为缓冲区进行预热。 这些缓冲的实例称为预热实例。 此缓冲区可减少缩放过程中所需的新实例的冷启动。

始终就绪实例

在高级计划中,你可以让应用在指定数量的实例上始终处于就绪状态。 无论负载情况如何,应用都会在这些实例上持续运行。 如果负载超出始终就绪实例可处理的数量,则会根据需要添加更多实例,最多可达到指定的最大值。

此应用级设置还可控制计划的最小实例数。 例如,考虑在同一高级计划中包含三个函数应用。 如果两个应用始终准备好实例计数设置为 1,并在第三个实例中将其设置为 5,则整个计划的最小数目为 5。 这也反映了对计划计费的最小实例数。 每个应用支持的始终就绪实例的最大数目为 20。

你可以通过以下方式在 Azure 门户中配置始终就绪实例的数目:选择你的函数应用,转到“平台功能”选项卡,然后选择“横向扩展”选项。 在函数应用编辑窗口中,始终就绪实例是该应用特有的。

Elastic scale settings in the portal

预热实例

预热实例计数设置在 HTTP 缩放和激活事件期间提供预热实例作为缓冲区。 预热实例将持续提供缓冲,直至达到最大横向扩展限制。 默认的预热实例计数为 1,在大多数情况下此值应保留为 1。

请考虑不太常见的场景,例如在自定义容器中运行的应用。 由于自定义容器的预热时间较长,因此可以考虑增加预热实例的此缓冲区。 仅在使用所有活动实例后,预热实例才会变为活动状态。

还可以在定义预热过程中运行的预热触发器。 你可以在预热过程中使用预热触发器来预加载自定义依赖项,使你的函数能够准备就绪,以便立即开始处理请求。 若要了解详情,请参阅 Azure Functions 预热触发器

请考虑此示例,了解始终就绪实例和预热实例如何协同工作。 高级函数应用配置了两个始终就绪实例和一个默认的预热实例。

Scale out graph

  1. 当应用处于空闲状态且未触发任何事件时,应用将通过两个实例进行预配并运行。 此时,需为两个始终就绪实例付费,但无需为预热实例付费,因为未分配预热实例。
  2. 当应用程序开始接收 HTTP 流量时,将在两个始终就绪实例之间对请求进行负载均衡。 这两个实例开始处理事件后,会立即添加一个实例来填充预热缓冲区。 应用现在运行时有三个预配的实例:两个始终就绪实例,以及第三个预热的处于非活动状态的缓冲区。 你需为这三个实例付费。
  3. 随着负载的增加,并且应用需要更多实例来处理 HTTP 流量,该预热实例会切换为活动实例。 HTTP 负载现在会路由到所有三个实例,并且会立即预配第四个实例以填充预热缓冲区。
  4. 会持续采用这种缩放和预热顺序,直至达到应用的最大实例计数或负载减少而导致平台在一段时间后缩减。 不会预热或激活超出最大值的实例。

无法在门户中更改预热实例计数设置,必须改用 Azure CLI 或Azure PowerShell。

最大函数应用实例数

除了计划最大突发计数,还可以配置每个应用的最大值。 可以使用应用规模限制配置应用最大值。 应用横向扩展上限不得超过计划的突发实例数上限。

专用网络连接

部署到高级计划的函数应用可以利用针对 Web 应用的虚拟网络集成。 配置后,你的应用可以与虚拟网络中的资源通信,或通过服务终结点获得保护。 应用上也提供 IP 限制,以限制传入流量。

在高级计划中向函数应用分配子网时,你需要有一个具有足够 IP 地址的子网,用于每个潜在的实例。 我们需要一个至少包含 100 个可用地址的 IP 块。

有关详细信息,请参阅将函数应用与虚拟网络集成

快速弹性缩放

使用与消耗计划相同的快速缩放逻辑,为你的应用自动添加其他计算实例。 同一应用服务计划中的应用会基于单个应用的需求彼此独立地进行缩放。 但是,如果可能,同一应用服务计划中的 Functions 应用会共享 VM 资源,以便降低成本。 与某个 VM 关联的应用数取决于每个应用的资源占用情况和 VM 大小。

若要详细了解缩放工作原理,请参阅 Azure Functions 中事件驱动的缩放

更长的运行持续时间

消耗计划中的 Functions 限制为单次执行 10 分钟。 在高级计划中,运行持续时间默认为 30 分钟,以防止执行失控。 不过,你可以修改 host.json 配置,使高级计划应用的持续时间无限长,但具有以下限制:

  • 平台升级可能触发托管式关闭并停止函数执行。
  • 平台中断可能导致未经处理的关闭并停止函数执行。
  • 有一个空闲计时器,如果一直没有新的执行,它会在 60 分钟后停止辅助角色。
  • 横向缩减行为可能会导致 60 分钟后关闭辅助角色。
  • 槽交换可能会在交换期间终止源槽和目标槽上的执行。

迁移

如果你有现有的函数应用,可以使用 Azure CLI 命令在 Windows 上的消耗计划和高级计划之间迁移该应用。 具体的命令取决于迁移方向。 有关详细信息,请参阅计划迁移

Linux 不支持此迁移。

高级计划设置

创建计划时,有两个计划大小设置:实例的最小数目(或计划大小)和最大突发限制。

如果应用需要的实例数超出了始终就绪实例数,则它可以继续横向扩展,直到实例数达到最大突发限制或应用最大横向扩展限制(如果已配置)。 仅当实例正在运行并分配给你时,你才需要为这些实例付费(按秒计费)。 平台会尽最大努力将你的应用横向扩展到所定义的最大限制。

可以在 Azure 门户中配置计划大小和最大值,方法是在部署到该计划的函数应用的“设置”下选择“横向扩展”选项。

Elastic plan size settings in the portal

每个高级计划的最小值至少为 1 个实例。 系统会根据计划中应用请求的始终就绪实例来确定实际最小实例数。 例如,如果应用 A 请求五个始终就绪实例,而应用 B 请求同一计划中两个始终就绪的实例,则最小计划大小确定为 5。 应用 A 在所有五个上运行,并且应用 B 仅在 2 上运行。

重要

对于在最小实例计数中分配的每个实例,无论函数是否正在执行,系统都会向你收费。

在大多数情况下,此自动计算的最小值可以满足需要。 但是,系统会尽力进行超出最小值的缩放。 如果其他实例不可用,则在特定的时间,横向扩展可能会延迟,虽然这种情况不太可能发生。 通过将最小值设置为高于自动算出的最小值,可以在横向扩展之前预留实例。

可以在 Azure 门户中配置最少实例数,方法是在部署到该计划的函数应用的“设置”下选择“横向扩展”选项。

Minimum instance settings in the portal

可用的实例 SKU

创建或缩放计划时,可以在三个实例大小之间进行选择。 你将按分配给你的每个实例的内核总数以及每秒的预配内存付费。 你的应用可以根据需要自动横向扩展到多个实例。

SKU 核心数 内存 存储
EP1 1 3.5GB 250GB
EP2 2 7GB 250GB
EP3 4 14GB 250GB

内存使用情况注意事项

在具有更多内存的计算机上运行并不一定意味着函数应用会使用所有可用内存。

例如,JavaScript 函数应用受 Node.js 中的默认内存限制约束。 若要增大此固定内存限制,请添加值为 --max-old-space-size=<max memory in MB> 的应用设置 languageWorkers:node:arguments

对于内存超过 4GB 的计划,请确保“位数”平台设置在常规设置下设置为 64 Bit

区域最大横向扩展

以下是每个区域和 OS 配置中单个计划当前支持的最大横向扩展值:

区域 Windows Linux
中国北部 2 100 100
中国东部 2 100 20
中国北部 2 100 20

后续步骤