你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Functions 托管选项

在 Azure 中创建函数应用时,必须为应用选择托管选项。 Azure 为函数代码提供了以下托管选项:

托管选项 服务 可用性 容器支持
消耗计划 Azure Functions 正式发布 (GA)
Flex 消耗计划 Azure Functions 预览
高级计划 Azure Functions GA Linux
专用计划 Azure Functions GA Linux
容器应用 Azure Container Apps GA Linux

Azure Functions 托管选项由 Linux 和 Windows 虚拟机上的 Azure 应用服务基础结构提供支持。 选择的托管选项决定了以下行为:

  • 函数应用的缩放方式。
  • 每个函数应用实例可用的资源。
  • 对 Azure 虚拟网络连接等高级功能的支持。
  • 支持 Linux 容器。

你选择的计划也会影响运行函数代码的成本。 有关详细信息,请参阅计费

本文提供了各种托管选项之间的详细比较。 要详细了解如何在 Linux 容器中运行和管理函数代码,请参阅 Azure Functions 中的 Linux 容器支持

计划概述

以下是 Azure Functions 托管的各种选项的优点摘要:

选项 好处
消耗计划 仅当函数以自动缩放方式运行(即用即付)时,才需要为计算资源付费。

在消耗计划中,会根据传入事件数动态添加和删除 Functions 主机的实例。

✔ 提供真正无服务器托管的默认托管计划。
✔ 仅当函数运行时才产生费用。
✔ 即使是在负载较高期间也可自动缩放。
Flex 消耗计划 通过计算选择、虚拟网络和即用即付计费获得高可伸缩性。

在 Flex 消耗计划中,会根据配置的每个实例的并发性和传入事件数动态添加和移除 Functions 主机的实例。

✔ 通过指定许多预先预配(始终就绪)的实例来减少冷启动。
✔ 支持虚拟网络以增强安全性。
✔ 仅当函数运行时才产生费用。
✔ 即使是在负载较高期间也可自动缩放。
高级计划 使用预热的工作器根据需要自动缩放,这些工作器在空闲后无延迟地运行应用程序,在更强大的实例上运行,并连接到虚拟网络。

请考虑下列情况中的 Azure Functions 高级计划:

✔ 你的函数应用持续地运行,或者近乎持续地运行。
✔ 你希望对实例进行更多控制,并希望使用事件驱动的缩放在同一计划上部署多个函数应用。
✔ 你具有大量的小型执行操作,在消耗计划中的执行费用较高但 GB 秒数较低。
✔ 你需要的 CPU 或内存选项超出消耗计划提供的选项。
✔ 你的代码所需的运行时间超过消耗计划允许的最长执行时间。
✔ 你需要虚拟网络连接。
✔ 你想要提供一个自定义 Linux 映像来运行函数。
专用计划 在应用服务计划中以定期应用服务计划费率运行你的函数。

最适用于不能使用 Durable Functions 的长时间运行的方案。 对于以下情况,可以考虑使用应用服务计划:

✔ 你拥有未充分利用的现有虚拟机,这些虚拟机已经在运行其他应用服务实例。
✔ 你必须具有完全可预测的计费,或者需要手动缩放实例。
✔ 你想要在同一计划中运行多个 Web 应用和函数应用
✔ 你需要访问更大的计算大小选项。
✔ 应用服务环境 (ASE) 提供完全计算隔离和安全网络访问。
✔ 内存使用率非常高且规模大 (ASE)。
容器应用 在 Azure 容器应用托管的完全托管环境中创建和部署容器化函数应用。

使用 Azure Functions 编程模型生成事件驱动、无服务器、云原生函数应用。 将函数与其他微服务、API、网站和工作流作为容器托管的程序一起运行。 在以下情况下,请考虑在容器应用中托管函数:

✔ 你希望将自定义库与函数代码打包在一起,以支持业务线应用。
✔ 需要将代码执行从本地或旧版应用迁移到容器中运行的云原生微服务。
✔ 如果想要避免管理 Kubernetes 群集和专用计算的开销和复杂性。
✔ 你的函数需要专用 GPU 计算资源提供的高端处理能力。

本文中的其余表根据各种功能和行为对托管选项进行了比较。

操作系统支持

下表显示操作系统对托管选项的支持。

承载 Linux1 部署 Windows2 部署
消耗计划 ✅ 仅限代码
❌ 容器(不支持)
✅ 仅限代码
Flex 消耗计划 ✅ 仅限代码
❌ 容器(不支持)
❌ 不支持
高级计划 ✅ 仅限代码
✅ 容器
✅ 仅限代码
专用计划 ✅ 仅限代码
✅ 容器
✅ 仅限代码
容器应用 ✅ 仅限容器 ❌ 不支持

1 对于 Python 运行时堆栈,Linux 是唯一受支持的操作系统。
2 Windows 部署仅限代码。 Functions 目前不支持 Windows 容器。

函数应用超时持续时间

函数应用中函数的超时时间通过 host.json 项目文件中的 functionTimeout 属性进行定义。 此属性专门应用于函数执行。 触发器启动函数执行后,函数需要在超时持续时间内返回/响应。 有关详细信息,请参阅改进 Azure Functions 性能和可靠性

下表显示特定计划的默认值和最大值(以分钟为单位):

计划 默认 Maximum1
消耗计划 5 10
Flex 消耗计划 30 不受限制3
高级计划 302 不受限制3
专用计划 302 不受限制3

1 不管函数应用超时设置如何,230 秒是 HTTP 触发的函数在响应请求时需要的最长时间。 这起因于 Azure 负载均衡器的默认空闲超时。 对于处理时间较长的情况,考虑使用 Durable Functions 异步模式延迟实际工作并返回即时响应
2 1.x 版 Functions 运行时的默认超时无限制。
3 保证最长 60 分钟。 OS 和运行时修补、漏洞修补和横向缩减行为仍可取消函数执行,因此请确保编写的函数可靠4 在 Flex 消耗计划中,主机不会强制实施执行时间限制。 但是,目前没有保证,因为平台可能需要在横向缩减、部署或应用更新期间终止实例。

语言支持

有关 Functions 中当前本机语言堆栈支持的详细信息,请参阅 Azure Functions 中支持的语言

缩放

下表对各种托管计划的缩放行为进行了比较。
除非另有说明,否则最大实例数根据函数应用(消耗)或计划(高级/专用)给出。

计划 向外扩展 最大实例数
消耗计划 事件驱动型。 即使是在高负载期间也可自动横向扩展。 Azure Functions 基础结构可根据传入的触发器事件数添加更多 Functions 主机实例来缩放 CPU 和内存资源。 Windows:200
Linux:1001
Flex 消耗计划 按函数缩放。 事件驱动的缩放决策是按函数计算的,这提供了一种更具确定性的方式来缩放应用中的函数。 除了 HTTP、Blob 存储(事件网格)和 Durable Functions 之外,应用中的所有其他函数触发器类型都可在独立的实例上缩放。 应用中的所有 HTTP 触发器都在同一实例上作为一个组进行缩放,所有 Blob 存储(事件网格)触发器也是如此。 所有 Durable Functions 触发器也共享实例并一起缩放。 仅受给定区域中所有实例的总内存使用量限制。 有关详细信息,请参阅实例内存
高级计划 事件驱动型。 即使是在负载较高期间也可自动扩展。 Azure Functions 基础结构可根据触发函数的事件数添加更多的 Functions 主机实例,因此可以缩放 CPU 和内存资源。 Windows:100
Linux:20-1002
专用计划3 手动/自动缩放 10-30
100 (ASE)

1 在横向扩展期间,目前对于消耗计划中的 Linux 应用,每个订阅每小时最多 500 个实例。
2 在某些区域,高级计划中的 Linux 应用可以扩展到 100 个实例。 有关详细信息,请参阅高级计划文章
3 有关各种应用服务计划选项的特定限制,请参阅应用服务计划限制

冷启动行为

计划 详细信息
消耗计划 当空闲时,应用数可能会缩减为零,这意味着某些请求在启动时可能会产生更多延迟。 消耗计划有一些可帮助缩短冷启动时间的优化措施,包括从已经运行函数主机和语言进程的预热占位符函数中进行拉取。
Flex 消耗计划 支持始终就绪的实例,以减少预配新实例时的延迟。
高级计划 支持始终就绪的实例,通过允许维护一个或多个永久暖实例来避免冷启动。
专用计划 在专用计划中运行时,Functions 主机可以在规定数量的实例上连续运行,这意味着冷启动实际上不是问题。

服务限制

资源 消耗计划 Flex 消耗计划12 高级计划 专用计划/ASE
默认超时持续时间(分钟) 5 30 30 301
最大超时持续时间(分钟) 10 无限制15 无限制7 无限制2
最大出站连接数(每个实例) 600 个处于活动状态(总共 1200 个) 无限制 无限制 无限制
最大请求大小 (MB)3 100 100 100 100
最大查询字符串长度3 4096 4096 4096 4096
最大请求 URL 长度3 8192 8192 8192 8192
每个实例的 ACU 100 不定 210-840 100-840/210-2508
最大内存(每个实例的 GB 数) 1.5 413 3.5-14 1.75-14/3.5-14
最大实例计数 (Windows/Linux) 200/100 1000 14 100/20 因 SKU/100 而异9
每个计划的函数应用数11 100 100 100 无限制4
应用服务计划 每个区域 100 个 不适用 每个资源组 100 个 每个资源组 100 个
每个应用的部署槽位10 2 不适用 3 1-209
存储5 5 GB 250 GB 250 GB 50-1000 GB
每个应用的自定义域数 5006 500 500 500
自定义域 SSL 支持 包含无限制的 SNI SSL 连接 包含无限制的 SNI SSL 连接和 1 个 IP SSL 连接 包含无限制的 SNI SSL 连接和 1 个 IP SSL 连接 包含无限制的 SNI SSL 连接和 1 个 IP SSL 连接

有关服务限制的说明:

  1. 默认情况下,应用服务计划中的 Functions 1.x 运行时的超时是无限制的。
  2. 要求将应用服务计划设置为 Always On。 按标准费率付费。
  3. 这些限制在主机中设置
  4. 可以托管的函数应用的实际数目取决于应用的活动、计算机实例的大小和相应的资源利用率。
  5. 存储限制是同一应用服务计划中所有应用的临时存储中的总内容大小。 消耗计划使用 Azure 文件存储作为临时存储。
  6. 当函数应用托管在消耗计划中时,仅支持 CNAME 选项。 对于高级计划应用服务计划中的函数应用,可以使用 CNAME 或 A 记录映射自定义域。
  7. 保证最长 60 分钟。
  8. 辅助角色是托管客户应用的角色。 工作器有 3 种固定大小:一个 vCPU/3.5 GB RAM;两个 vCPU/7 GB RAM;四个 vCPU/14 GB RAM。
  9. 有关详细信息,请参阅应用服务限制
  10. 包括生产槽。
  11. 给定订阅中当前有 5000 个函数应用的限制。
  12. Flex 消耗计划目前为预览版。
  13. Flex 消耗计划实例大小目前定义为 2,048 MB 或 4,096 MB。 有关详细信息,请参阅实例内存
  14. 预览期间的 Flex 消耗计划具有区域订阅配额,限制了给定区域中所有实例的总内存使用量。 有关详细信息,请参阅实例内存
  15. 在 Flex 消耗计划中,主机不会强制实施执行时间限制。 但是,目前没有保证,因为平台可能需要在横向缩减、部署或应用更新期间终止实例。

网络功能

功能 消耗计划 Flex 消耗计划 高级计划 专用计划/ASE
入站 IP 限制 ✅是 ✅是 ✅是 ✅是
入站专用终结点 ❌否 ✅是 ✅是 ✅是
虚拟网络集成 ❌否 ✅是(区域) ✅是(区域) ✅是(区域和网关)
虚拟网络触发器(非 HTTP) ❌否 ✅是 ✅是 ✅是
混合连接(仅限 Windows) ❌否 ✅是 ✅是 ✅是
出站 IP 限制 ❌否 ✅是 ✅是 ✅是

计费

计划 详细信息
消耗计划 只需为函数运行时间付费。 账单将基于执行数量、执行时间和所用内存。
Flex 消耗计划 计费基于执行次数、实例主动执行函数时的内存以及任何始终就绪实例的成本。 有关详细信息,请参阅 Flex 消耗计划计费
高级计划 高级计划基于在必需实例和预热实例中使用的核心秒数和内存。 每个计划必须至少有一个实例始终处于预热状态。 此计划提供了最可预测的定价。
专用计划 应用服务计划中函数应用的费用与其他应用服务资源(例如 Web 应用)的费用相同。

对于 ASE,每月会产生统一的基础结构使用费,该费率不会随环境大小的变化而改变。 每个应用服务计划 vCPU 也会产生费用。 ASE 中托管的所有应用都在“隔离”定价 SKU 中。 有关详细信息,请参阅 ASE 概述一文。

有关动态托管计划(消耗、Flex 消耗和高级)之间的直接成本比较,请参阅 Azure Functions 定价页。 有关各种专用计划选项的定价,请参阅应用服务定价页。 有关容器应用托管的定价,请参阅 Azure 容器应用定价

在现有资源组中创建新函数应用的限制

在某些情况下,当尝试在现有资源组中为函数应用创建新的托管计划时,可能会收到以下错误之一:

  • 此资源组中不允许该定价层
  • SKU_name 辅助角色在资源组 resource_group_name 中不可用<><>

在以下条件成立时可能出现此情况:

  • 在包含另一个函数应用或 Web 应用的现有资源组中创建函数应用。 例如,Linux 消耗计划应用在 Linux 专用或 Linux 高级计划所在的资源组中不受支持。
  • 新函数应用在先前的应用所在的区域中创建。
  • 先前的应用在某些方面与新应用不兼容。 这可能发生在 SKU、操作系统之间,也可能由于其他平台级功能(如可用性区域支持)而发生这种情况。

发生这种情况的原因是在创建函数应用和 Web 应用计划时映射到不同的资源池的方式不同。 不同的 SKU 需要一组不同的基础结构功能。 在资源组中创建应用时,资源组会被映射并分配到指定资源池。 如果尝试在该资源组中创建另一个计划,而映射的池没有所需的资源,就会出现该错误。

发生此错误时,请改为在新资源组中创建函数应用和托管计划。

后续步骤