在 Azure 中创建函数应用时,必须为应用选择托管选项。 Azure 为函数代码提供了以下托管选项:
| 托管选项 | 服务 | 可用性 | 容器支持 |
|---|---|---|---|
| 高级计划 | Azure Functions | GA | Linux |
| 专用计划 | Azure Functions | GA | Linux |
| 消耗计划 | Azure Functions | Windows - 正式版 Linux - 已停用 |
无 |
重要
2028 年 9 月 30 日之后,在消耗计划中托管 Linux 上的函数应用的选项将停用。 消耗计划中在 Windows 上运行的应用不受此更改的影响。
Linux 和 Windows 虚拟机上的 Azure 应用服务基础结构有助于使用 Azure Functions 托管选项。 选择的托管选项决定了以下行为:
- 你的函数应用程序的扩展方式。
- 每个函数应用实例可用的资源。
- 对 Azure 虚拟网络连接等高级功能的支持。
你选择的计划也会影响运行函数代码的成本。 有关详细信息,请参阅 计费。
计划概述
下表总结了 Azure Functions 托管的各种选项的优点。
| 选项 | 好处 |
|---|---|
| 高级计划 | 使用预热工作器根据需求自动扩展,这些工作器在空闲后可以立即运行应用程序,运行在更强大的实例上,并连接到虚拟网络。 请考虑下列情况中的 Azure Functions 高级计划: ✔ 你的函数应用持续地运行,或者近乎持续地运行。 ✔ 你希望对实例进行更多控制,并希望使用事件驱动的缩放在同一计划上部署多个函数应用。 ✔ 你在使用计划中具有大量的小型执行操作,其执行费用较高,但 GB 秒数较低。 ✔ 你需要的 CPU 或内存选项超出消耗计划提供的选项。 ✔ 你的代码所需的运行时间超过消耗计划允许的最长执行时间。 ✔ 需要虚拟网络连接才能安全访问 Azure 资源。 ✔ 你想要提供一个自定义 Linux 映像来运行函数。 |
| 专用计划 | 在应用服务计划中以定期应用服务计划费率运行你的函数。 最适用于不能使用 Durable Functions 的长时间运行的方案。 对于以下情况,可以考虑使用应用服务计划: ✔ 你拥有未充分利用的现有虚拟机,这些虚拟机已经在运行其他应用服务实例。 ✔ 你必须具有完全可预测的计费,或者需要手动调整实例规模。 ✔ 你想要在同一计划中运行多个 Web 应用和函数应用 ✔ 你需要访问更大的计算大小选项。 ✔ 应用服务环境 (ASE) 提供完全计算隔离和安全网络访问。 ✔ 内存使用率非常高且规模大 (ASE)。 |
| 消耗计划 | 仅在函数在 Windows 上运行(即用即付)时为计算资源付费。 在消耗计划中,函数实例根据传入事件数动态添加和删除。 考虑以下情况下的消耗计划: ✔ 你依赖于 Windows。 例如,使用 v1 运行时、完整的 .NET Framework 或特定于 Windows 的功能,例如某些 PowerShell 模块。 ✔ 您想要一个无服务器计费模型,并且仅在函数运行时付费。 |
本文中的其余表根据各种功能和行为对托管选项进行了比较。
操作系统支持
下表显示操作系统对托管选项的支持。
| Hosting | Linux1 部署 | Windows2 部署 |
|---|---|---|
| 高级计划 |
✅ 仅限代码 ✅ 容器 |
✅ 仅限代码 |
| 专用计划 |
✅ 仅限代码 ✅ 容器 |
✅ 仅限代码 |
| 消耗计划3 |
✅ 仅代码 (已停用) ❌ 容器(不支持) |
✅ 仅限代码 |
- Linux 是 Python 运行时堆栈唯一支持的作系统。
- Windows 部署仅通过代码进行。 Azure Functions 目前不支持 Windows 容器。
- 在消耗计划中在 Linux 上运行应用的功能将于 2028 年 9 月 30 日停用。 有关详细信息,请参阅 消耗计划。
函数应用超时持续时间
函数应用中函数的超时时间通过 functionTimeout 项目文件中的 属性进行定义。 此属性专门应用于函数执行。 触发器启动函数执行后,函数需要在超时持续时间内返回/响应。 为了避免超时,必须 编写可靠的函数。 有关详细信息,请参阅 改进 Azure Functions 性能和可靠性。
下表显示特定计划的默认值和最大值(以分钟为单位):
| 计划 | 默认 | 最大1 |
|---|---|---|
| 高级计划 | 304 | 无限制2 |
| 专用计划 | 304 | 无界限3 |
| 消耗计划 | 5 | 10 |
- 无论函数应用的超时设置如何,HTTP 触发的函数响应请求的最长时间均为 230 秒。 这起因于 Azure 负载均衡器的默认空闲超时。 对于较长的处理时间,请考虑使用 延迟实际工作并返回即时响应。
- 不会强制实施最大执行超时持续时间。 但是,函数执行在高级计划的缩减期间宽限期为60分钟,而在平台更新期间宽限期为10分钟。
- 要求将应用服务计划设置为 Always On。 在平台更新期间提供 10 分钟的宽限期。
- 1.x 版 Functions 主机运行时的默认超时为“无限制”。
- 当最小副本数设置为零时,默认超时取决于应用中使用的特定触发器。
此表中的值假定 Azure Functions 主机进程已启动并正常运行。 特定语言工作进程启动同样允许最长 60 秒的超时时间。 工作进程启动超时当前不可配置。
语言支持
有关 Functions 中当前本机语言堆栈支持的详细信息,请参阅 Azure Functions 中支持的语言。
比例尺/规模
下表对各种托管计划的缩放行为进行了比较。
除非另有说明,否则最大实例数是按每个函数应用程序(消耗)或每个计划(高级计划/专用计划)来提供。
| 计划 | 向外扩展 | 最大实例数 |
|---|---|---|
| 高级计划 | 事件驱动型。 即使在高负载期间,也可自动进行扩展。 Azure Functions 基础结构可根据触发函数的事件数添加更多的 Functions 主机实例,因此可以缩放 CPU 和内存资源。 | Windows:1006 Linux: 20-1002,6 |
| 专用计划 | 手动/自动缩放 | 10-303 100 (ASE) |
|
消耗计划 | 事件驱动。 根据事件来源自动缩放。 Functions 基础设施通过根据传入触发事件的数量添加更多函数宿主实例来扩展资源。
|
Windows: 200
Linux: 1005 |
- 在某些区域中,高级计划中的 Linux 应用可以缩放到 100 个实例。 有关详细信息,请参阅 高级计划文章。
- 有关各种应用服务计划选项的特定限制,请参阅 应用服务计划限制。
- 在横向扩展期间,目前对于消耗计划中的 Linux 应用,每个订阅每小时最多 500 个实例。
- 对于专用终结点限制的 http 触发器,横向扩展最多仅限于 20 个实例。
冷启动行为
| 计划 | 详细信息 |
|---|---|
| 高级计划 | 通过允许维护一个或多个永久暖机实例,支持始终就绪实例以避免冷启动。 |
| 专用计划 | 在专用计划中运行时,Functions 主机可以在指定的实例数上连续运行,这意味着冷启动并不是问题。 |
| 消耗计划 | 当空闲时,应用数可能会缩减为零,这意味着某些请求在启动时可能会产生更多延迟。 消耗计划确实具备一些优化措施以帮助缩短冷启动时间,其中包括从已经预热的占位函数中拉取,这些函数已经有主机和语言进程在运行。 |
服务限制
| 资源 | 高级计划 | 专用计划/ASE | 消耗计划 | |
|---|---|---|---|---|
| 默认 超时时长(分钟) | 30 | 30 | 301 | 5 |
| 最大 超时持续时间 (分钟) | unbounded9 | unbounded9 | 无限2 | 10 |
| 最大出站连接数(每个实例) | 无限制 | 无限制 | 无限制 | 600 个活跃(总共 1200 个) |
| 最大请求大小 (MB)3 | 210 | 210 | 210 | 210 |
| 最大查询字符串长度3 | 4096 | 4096 | 4096 | 4096 |
| 最大请求 URL 长度3 | 8192 | 8192 | 8192 | 8192 |
| 每个实例的 ACU 数 | 210-840 | 100-840/210-25010 | varies | varies |
| 最大内存(每个实例的 GB 数) | 414 | 3.5-14 | 1.75-256/8-256 | 1.5 |
| 最大实例计数 (Windows |Linux)15 | n/a |1000 | 20-100 | 10-30 (100 ASE)11 | 200 |100 |
| 每个计划的函数应用数13 | 1 | 100 | 无限4 | 100 |
| 应用服务计划 | 不适用 | 每个资源组 100 个 | 每个资源组 100 个 | 每个区域 100 个 |
| 每个应用有12个部署槽位 | 不适用 | 3 | 1-2011 | 2 |
| 存储(临时)5 | 0.8 GB | 21-140 GB | 11-140 GB(千兆字节) | 0.5 GB |
| 存储(持久化) | 0 GB 7 | 250 GB | 10-1000 GB11 | 1 GB6,7 |
| 每个应用的自定义域数 | 258 | 500 | 500 | 5008 |
| 自定义域 TSL/SSL 支持 | 包含无限制的 SNI SSL 和一个 IP SSL 连接 | 包含无限制的 SNI SSL 和一个 IP SSL 连接 | 包含无限制的 SNI SSL 和一个 IP SSL 连接 | 包含无限制的 SNI SSL 连接 |
有关服务限制的说明:
- 默认情况下,应用服务计划中的 Functions 1.x 运行时的超时无限制。
- 要求将应用服务计划设置为 Always On。 按标准 费率付费。 在平台更新期间为 HTTP 触发的函数提供 10 分钟的宽限期,但不适用于其他触发器。
- 这些限制在主机中设置。
- 可以托管的函数应用的实际数目取决于应用的活动、计算机实例的大小和相应的资源利用率。
- 存储限制是同一应用服务计划中所有应用的临时存储中的总内容大小。 对于 Linux 上的消耗计划,存储目前为 1.5 GB。
- 消耗计划使用 Azure 文件存储共享进行持久存储。 提供自己的 Azure 文件共享时,特定的共享大小限制取决于为 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING设置的存储帐户。
- 在 Linux 上,必须显式装载自己的 Azure 文件存储共享。
- 当函数应用托管在消耗计划中时,仅支持 CNAME 选项。 对于 高级计划 或 应用服务计划中的功能应用,可以使用 CNAME 或 A 记录映射自定义域。
- 不强制实施最大执行超时期限。 不过,为函数执行提供的宽限期在横向缩减期间为 60 分钟,在平台更新期间为 10 分钟。
- 辅助角色是托管客户应用的角色。 工作器有 3 种固定大小:一个 vCPU/3.5 GB RAM;两个 vCPU/7 GB RAM;四个 vCPU/14 GB RAM。
- 有关详细信息,请参阅应用服务限制。
- 包括生产槽。
- 给定订阅中当前有 5,000 个函数应用的限制。
- 有关详细信息,请参阅托管比较文章中的 缩放 。
- 当最小副本数设置为零时,默认超时取决于应用中使用的特定触发器。
- 当最小副本数设置为一个或多个时。
网络功能
| 功能 | 消耗计划 | 高级计划 | 专用计划/ASE | |
|---|---|---|---|---|
| 入站 IP 限制 | ✔ | ✔ | ✔ | ✔ |
| 入站专用终结点 | ✔ | ✔ | ✔ | |
| 虚拟网络集成 | ✔ | ✔2 | ✔3 | |
| 出站 IP 限制 | ✔ | ✔ | ✔ |
- 有关详细信息,请参阅 Azure 容器应用环境中的网络。
- 使用虚拟网络触发器时,有一些特殊注意事项。
- 只有专用/ASE 计划支持网关所需的虚拟网络集成。
计费
| 计划 | 详细信息 |
|---|---|
| 高级计划 | 高级计划基于在必需实例和预热实例中使用的核心秒数和内存。 每个计划必须至少有一个实例始终处于预热状态。 此计划提供了最可预测的定价。 |
| 专用计划 | 应用服务计划中函数应用的费用与其他应用服务资源(例如 Web 应用)的费用相同。 对于 ASE,存在一个固定的月费率,用于支付基础设施的使用费用,该费率不会随环境大小的变化而改变。 每个应用服务计划 vCPU 也会产生费用。 ASE 中托管的所有应用都在独立定价模型中。 有关详细信息,请参阅 ASE 概述文章。 |
| 消耗计划 | 您只需为函数实际运行的时间付费。 账单将基于执行数量、执行时间和所用内存。 |
有关动态托管计划(消耗和高级版)之间的直接成本比较,请参阅 Azure Functions 定价页。 有关各种专用计划选项的定价,请参阅 应用服务定价页。
在现有资源组中创建新函数应用的限制
在某些情况下,当尝试在现有资源组中为函数应用创建新的托管计划时,可能会收到以下错误之一:
- 此资源组中不允许定价层
- <SKU_name> 辅助角色在资源组 <resource_group_name> 中不可用
满足以下条件时,可能会发生这些错误:
- 在尚未包含其他函数应用或 Web 应用的现有资源组中创建函数应用。 例如,Linux 消耗性应用在与 Linux 专用方案或 Linux 高级方案相同的资源组中不受支持。
- 新函数应用在先前的应用所在的区域中创建。
- 先前的应用在某些方面与新应用不兼容。 版本、作系统之间可能出现这种不兼容,或者是由于其他平台级功能(如可用性区域支持)造成的。
创建函数应用和 Web 应用计划时会映射到不同的资源池。 不同的计划需要一组不同的基础结构功能。 在资源组中创建应用时,资源组会被映射并分配到指定资源池。 如果尝试在该资源组中创建另一个计划,并且映射池没有所需的资源,则会发生上述错误。
如果发生这种情况,请改为在新资源组中创建函数应用和托管计划。