Azure Functions 中的事件驱动缩放

在消耗和高级计划中,Azure Functions 通过添加 Functions 主机的额外实例来缩放 CPU 和内存资源。 实例数取决于触发函数的事件数。

消耗计划中 Functions 主机的每个实例仅限使用 1.5 GB 内存和 1 个 CPU。 主机实例是整个函数应用,这意味着函数应用中的所有函数共享某个实例中的资源并同时缩放。 共享同一消耗计划的函数应用单独缩放。 在高级计划中,计划大小决定该实例上该计划中所有应用的可用内存和 CPU。

函数代码文件存储在函数主要存储帐户中的 Azure 文件共享上。 删除函数应用的主存储帐户时,函数代码文件将被删除并且无法恢复。

运行时缩放

Azure Functions 使用名为“缩放控制器”的组件来监视事件率以及确定是要横向扩展还是横向缩减。 缩放控制器针对每种触发器类型使用试探法。 例如,使用 Azure 队列存储触发器时,它会根据队列长度和最旧队列消息的期限进行缩放。

Azure Functions 的缩放单位为函数应用。 横向扩展函数应用时,将分配额外的资源来运行 Azure Functions 主机的多个实例。 相反,计算需求下降时,扩展控制器将删除函数主机实例。 当函数应用中没有运行函数时,实例数最终会“缩减”为零。

用于监视事件和创建实例的扩展控制器

冷启动

当你的函数应用空闲一定的分钟数后,平台可能会将用于运行你的应用的实例数量缩减为零。 下次请求将存在从零扩展到一所增加的延迟。 此延迟称为“冷启动”。 函数应用所需的依赖项的数目可能会影响冷启动时间。 冷启动对于同步操作(例如,必须返回响应的 HTTP 触发器)来说更是一个问题。 如果冷启动会影响你的函数,请考虑在高级计划中运行,或在启用了“始终可用”设置的专用计划中运行。

了解缩放行为

缩放可根据多种因素而异,可根据选定的触发器和语言以不同的方式缩放。 需要注意缩放行为的以下几个细节:

  • 最大实例数:单个函数应用最多只能横向扩展到 200 个实例。 不过,单个实例每次可以处理多个消息或请求,因此,对并发执行数没有规定的限制。 可根据需要指定一个较低的最大值来限制缩放。
  • 新实例率:对于 HTTP 触发器,将最多每隔 1 秒分配一次新实例。 对于非 HTTP 触发器,将最多每隔 30 秒分配一次新实例。 在高级计划中运行时,缩放速度会更快。
  • 缩放效率:对于服务总线触发器,请使用资源的管理权限,以实现最有效的缩放。 使用侦听权限时,由于队列长度不能用于通知缩放决策,缩放不够准确。 若要详细了解如何在服务总线访问策略中设置权限,请参阅共享访问授权策略。 有关事件中心触发器,请参阅此缩放指南

限制横向扩展

建议限制应用可用于横向扩展的最大实例数。最常见的情况是下游组件(如数据库)的吞吐量有限。 默认情况下,消耗计划函数可横向扩展到最多 200 个实例,高级计划函数可横向扩展到最多 100 个实例。 可修改 functionAppScaleLimit 值来指定特定应用的较低最大值。 若要不受限制,可将 functionAppScaleLimit 设置为 0null,或介于 1 和应用最大值之间的有效值。

az resource update --resource-type Microsoft.Web/sites -g <RESOURCE_GROUP> -n <FUNCTION_APP-NAME>/config/web --set properties.functionAppScaleLimit=<SCALE_LIMIT>
$resource = Get-AzResource -ResourceType Microsoft.Web/sites -ResourceGroupName <RESOURCE_GROUP> -Name <FUNCTION_APP-NAME>/config/web
$resource.Properties.functionAppScaleLimit = <SCALE_LIMIT>
$resource | Set-AzResource -Force

横向缩减行为

对函数的需求减少时,事件驱动的缩放会自动减少容量。 它通过关闭函数应用的辅助角色实例来执行此操作。 在关闭实例之前,新事件会停止发送到实例。 此外,会为当前正在执行的函数提供完成执行的时间。 系统会将此行为记录为排出模式。 对于消耗计划应用,此关闭期最多可以延长到 10 分钟;对于高级计划应用,此关闭期最多可以延长到 60 分钟。 事件驱动的缩放和此行为不适用于专用计划应用。

以下注意事项适用于横向缩减行为:

  • 对于在 Windows 上运行的消耗计划函数应用,默认情况下,只有 2021 年 5 月之后创建的应用才会启用排出模式行为。
  • 若要使用服务总线触发器为函数启用正常关闭,请使用 4.2.0 版或更高版本的服务总线扩展

事件中心触发器

本部分介绍当函数使用事件中心触发器IoT 中心触发器时的缩放行为。 在这种情况下,事件触发的函数的每个实例由单个 EventProcessorHost 实例提供支持。 触发器(由事件中心提供支持)确保只有一个 EventProcessorHost 实例能够在给定分区上获得租约。

例如,考虑如下所述的一个事件中心:

  • 10 个分区
  • 在所有分区之间平均分配 1000 个事件,每个分区中有 100 条消息

首次启用函数时,只有一个函数实例。 我们将第一个函数实例命名为 Function_0Function_0 函数具有单个 EventProcessorHost 实例,此实例在所有十个分区上都有租约。 此实例从分区 0-9 读取事件。 从此时开始,将发生下列情况之一:

  • 不需要新的函数实例:在 Functions 的缩放逻辑生效之前,Function_0 能够处理所有 1,000 个事件。 在这种情况下,所有 1,000 条消息都由 Function_0 处理。

  • 添加其他函数实例:如果 Functions 缩放逻辑确定 Function_0 的消息数超出了它的处理能力,则会创建新的函数应用实例 (Function_1)。 此新函数也有一个关联的 EventProcessorHost 实例。 基础事件中心检测到新主机实例在尝试读取消息时,会在主机实例之间对分区进行负载均衡。 例如,可以将分区 0-4 分配给 Function_0,将分区 5-9 分配给 Function_1

  • 额外添加 N 个函数实例:如果 Functions 缩放逻辑确定 Function_0Function_1 的消息数超出了它们的处理能力,则会创建新的 Functions_N 函数应用实例。 会一直创建应用,直到 N 大于事件中心分区数为止。 在我们的示例中,事件中心再次对分区进行负载均衡,在本例中是在实例 Function_0...Functions_9 之间进行的。

缩放时,N 实例是一个大于事件中心分区数的数字。 此模式用于确保 EventProcessorHost 实例可供用来在其他实例释放锁时在分区上获取锁。 你只需为执行函数实例时使用的资源付费。 换句话说,不需要为过度预配的资源付费。

当所有函数执行都完成时(不管是否有错误),则会将检查点添加到关联的存储帐户。 检查点设置成功后,永远不会再次检索所有 1,000 条消息。

可缩放应用的最佳做法和模式

函数应用的许多方面会影响其缩放,包括主机配置、运行时占用空间和资源效率。 有关详细信息,请查看性能注意事项一文的“可扩展”部分。 还要注意随着函数应用的扩展,连接是如何实施的。 有关详细信息,请参阅如何在 Azure Functions 中管理连接

有关使用 Python 和 Node.js 进行缩放的详细信息,请参阅 Azure Functions Python 开发人员指南 - 缩放和并发Azure Functions Node.js 开发人员指南 - 缩放和并发

计费模式

不同计划的计费在 Azure Functions 定价页中有详细介绍。 使用量在 Function App 级别聚合,只会统计函数代码的执行时间。 以下是计费单位:

  • 以千兆字节/秒 (GB-s) 计量的资源消耗量。 根据内存大小和函数应用中所有函数的执行时间组合计算得出。
  • 执行。 每次为响应事件触发而执行函数时记为一次。

帐单常见问题解答中可以找到有关如何了解消费帐单的有用查询和信息。

后续步骤