Azure Functions 托管选项
在 Azure 中创建函数应用时,必须为应用选择托管计划。 Azure Functions 提供三个基本 Azure Functions 托管计划:消耗计划、高级计划和专用(应用服务)计划。 这些托管计划由 Azure 应用服务基础结构提供辅助,在 Linux 和 Windows 虚拟机上已推出正式版 (GA)。
选择的 Azure Functions 托管计划规定了以下行为:
- 函数应用的缩放方式。
- 每个函数应用实例可用的资源。
- 对 Azure 虚拟网络连接等高级功能的支持。
此文详细比较了各种托管计划,包括基于容器的托管选项。
计划概述
下面汇总了三个主要 Azure Functions 托管计划的优势:
计划 | 好处 |
---|---|
消耗计划 | 自动缩放,你只需为函数运行时的计算资源付费。 在消耗计划中,会根据传入事件数动态添加和删除 Functions 主机的实例。 ✔ 默认托管计划。 ✔ 仅当函数运行时才产生费用。 ✔ 即使是在负载较高期间也可自动缩放。 |
高级计划 | 使用预热的工作器根据需要自动缩放,这些工作器在空闲后会毫不延迟地运行应用程序,在更强大的实例上运行,并连接到虚拟网络。 请考虑下列情况中的 Azure Functions 高级计划: ✔ 你的函数应用持续地运行,或者近乎持续地运行。 ✔ 你具有大量的小型执行操作,在消耗计划中的执行费用较高但 GB 秒数较低。 ✔ 你需要的 CPU 或内存选项超出消耗计划提供的选项。 ✔ 你的代码所需的运行时间超过消耗计划允许的最长执行时间。 ✔ 你需要使用消耗计划中未提供的功能,例如虚拟网络连接。 ✔ 需要提供用于运行函数的自定义 Linux 映像。 |
专用计划 | 在应用服务计划中以定期应用服务计划费率运行你的函数。 最适用于不能使用 Durable Functions 的长时间运行的方案。 对于以下情况,可以考虑使用应用服务计划: ✔ 具有已运行其他应用服务实例的、未充分利用的现成 VM。 ✔ 需要可预测的缩放和成本。 |
本文中的比较表还包括以下托管选项,这些选项提供了运行函数应用所需的最大限度的控制和隔离。
托管选项 | 详细信息 |
---|---|
ASE | 应用服务环境 (ASE) 是一项应用服务功能,可提供完全隔离和专用的环境,以便高度安全地运行应用服务应用。 ASE 适用于有以下要求的应用程序工作负荷: ✔ 极高的缩放性。 ✔完全计算隔离和安全的网络访问。 ✔ 内存使用率较高。 |
Kubernetes (直接) |
Kubernetes 提供了一个在 Kubernetes 平台之上运行的完全隔离的专用环境。 Kubernetes 适用于有以下要求的应用程序工作负荷: ✔ 自定义硬件要求。 ✔ 隔离和安全的网络访问。 ✔ 能够在混合或多云环境中运行。 ✔ 与现有的 Kubernetes 应用程序和服务一起运行。 |
本文中的其余表在各种功能和行为方面对计划进行了比较。 有关动态托管计划(“消耗”和“高级”)之间的成本比较,请参阅 Azure Functions 定价页。 有关各种专用计划选项的定价,请参阅应用服务定价页。
操作系统/运行时
下表显示了托管计划的操作系统和语言支持。
Linux1、2 仅限代码 |
仅限 Windows 代码 | Linux1、2、3 Docker 容器 |
|
---|---|---|---|
消耗计划 | C# JavaScript Java Python PowerShell Core TypeScript |
C# JavaScript Java PowerShell Core TypeScript |
不支持 |
高级计划 | C# JavaScript Java Python PowerShell Core TypeScript |
C# JavaScript Java PowerShell Core TypeScript |
C# JavaScript Java PowerShell Core Python TypeScript |
专用计划 | C# JavaScript Java Python TypeScript |
C# JavaScript Java PowerShell Core TypeScript |
C# JavaScript Java PowerShell Core Python TypeScript |
ASE | C# JavaScript Java Python TypeScript |
C# JavaScript Java PowerShell Core TypeScript |
C# JavaScript Java PowerShell Core Python TypeScript |
Kubernetes(直接) | 不适用 | 不适用 | C# JavaScript Java PowerShell Core Python TypeScript |
1 对于 Python 运行时堆栈,Linux 是唯一受支持的操作系统。
2 Linux 上的 PowerShell 支持目前处于预览状态。
3 对于 Docker 容器,Linux 是唯一受支持的操作系统。
函数应用超时持续时间
函数应用中函数的超时时间通过 host.json 项目文件中的 functionTimeout
属性进行定义。 此属性专门应用于函数执行。 触发器启动函数执行后,函数需要在超时持续时间内返回/响应。 有关详细信息,请参阅改进 Azure Functions 性能和可靠性。
下表显示特定计划的默认值和最大值(以分钟为单位):
计划 | 默认 | Maximum1 |
---|---|---|
消耗计划 | 5 | 10 |
高级计划 | 302 | 无限制 |
专用计划 | 302 | 无限制 |
1 不管函数应用超时设置如何,230 秒是 HTTP 触发的函数在响应请求时需要的最长时间。 这起因于 Azure 负载均衡器的默认空闲超时。 对于处理时间较长的情况,考虑使用 Durable Functions 异步模式或延迟实际工作并返回即时响应。
2 1.x 版 Functions 运行时的默认超时无限制。
缩放
下表对各种托管计划的缩放行为进行了比较。
除非另有说明,否则最大实例数根据函数应用(消耗)或计划(高级/专用)给出。
计划 | 向外扩展 | 最大实例数 |
---|---|---|
消耗计划 | 事件驱动型。 即使是在负载较高期间也可自动扩展。 Azure Functions 基础结构可根据传入的触发器事件数添加额外的 Functions 主机实例,因此可以缩放 CPU 和内存资源。 | Windows:200 Linux:1001 |
高级计划 | 事件驱动型。 即使是在负载较高期间也可自动扩展。 Azure Functions 基础结构可根据触发函数的事件数添加额外的 Functions 主机实例,因此可以缩放 CPU 和内存资源。 | Windows:100 Linux:20-1002 |
专用计划3 | 手动/自动缩放 | 10-30 |
ASE3 | 手动/自动缩放 | 100 |
Kubernetes | 对使用 KEDA 的 Kubernetes 群集进行事件驱动型自动缩放。 | 因群集而异 |
1 在横向扩展期间,目前对于消耗计划中的 Linux 应用,每个订阅每小时最多 500 个实例。
2 在某些区域,高级计划中的 Linux 应用可以扩展到 100 个实例。 有关详细信息,请参阅高级计划文章。
3 有关各种应用服务计划选项的特定限制,请参阅应用服务计划限制。
冷启动行为
计划 | 详细信息 |
---|---|
消耗计划 | 当空闲时,应用数可能会缩减为零,这意味着某些请求在启动时可能会产生额外的延迟。 消耗计划有一些可缩短冷启动时间的优化措施,包括从已经运行函数主机和语言进程的预热占位符函数中进行拉取。 |
高级计划 | 永久预热实例以避免任何冷启动。 |
专用计划 | 在专用计划中运行时,Functions 主机可以连续运行,这意味着冷启动实际上不是问题。 |
ASE | 在专用计划中运行时,Functions 主机可以连续运行,这意味着冷启动实际上不是问题。 |
Kubernetes | 可以根据 KEDA 配置对应用进行配置以避免冷启动。 如果配置为缩放到零,则新事件会遇到冷启动。 |
服务限制
资源 | 消耗计划 | 高级计划 | 专用计划 | ASE | Kubernetes |
---|---|---|---|---|---|
默认超时持续时间(分钟) | 5 | 30 | 301 | 30 | 30 |
最大超时持续时间(分钟) | 10 | 无限制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 | AKS 定价 |
最大内存(每个实例的 GB 数) | 1.5 | 3.5-14 | 1.75-14 | 3.5 - 14 | 支持任何节点 |
最大实例计数 (Windows/Linux) | 200/100 | 100/20 | 因 SKU 而异9 | 1009 | 取决于群集 |
每个计划的函数应用数 | 100 | 100 | 无限制4 | 无限制 | 无限制 |
应用服务计划 | 每个区域 100 个 | 每个资源组 100 个 | 每个资源组 100 个 | - | - |
每个应用的部署槽位10 | 2 | 3 | 1-209 | 20 | 不适用 |
存储5 | 5 TB | 250 GB | 50-1000 GB | 1 TB | 不适用 |
每个应用的自定义域数 | 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 包括生产槽。
在现有资源组中创建新函数应用的限制
在某些情况下,当尝试在现有资源组中为函数应用创建新的托管计划时,可能会收到以下错误之一:
- 此资源组中不允许该定价层
- SKU_name 辅助角色在资源组 resource_group_name 中不可用<><>
在以下条件成立时可能出现此情况:
- 在包含另一个函数应用或 Web 应用的现有资源组中创建函数应用。
- 新函数应用在先前的应用所在的区域中创建。
- 先前的应用在某些方面与新应用不兼容。 这可能发生在 SKU、操作系统之间,或者由于其他平台级别的功能(例如可用性区域支持)而发生这种情况。
发生这种情况的原因是在创建函数应用和 Web 应用计划时映射到不同的资源池的方式不同。 不同的 SKU 需要一组不同的基础结构功能。 在资源组中创建应用时,资源组会被映射并分配到指定资源池。 如果尝试在该资源组中创建另一个计划,而映射的池没有所需的资源,则会出现该错误。
发生此错误时,请改为在新资源组中创建函数应用和托管计划。
网络功能
功能 | 消耗计划 | 高级计划 | 专用计划 | ASE | Kubernetes |
---|---|---|---|---|---|
入站 IP 限制 | ✅是 | ✅是 | ✅是 | ✅是 | ✅是 |
入站专用终结点 | ❌否 | ✅是 | ✅是 | ✅是 | ✅是 |
虚拟网络集成 | ❌否 | ✅是(区域) | ✅是(区域和网关) | ✅是 | ✅是 |
虚拟网络触发器(非 HTTP) | ❌否 | ✅是 | ✅是 | ✅是 | ✅是 |
混合连接(仅限 Windows) | ❌否 | ✅是 | ✅是 | ✅是 | ✅是 |
出站 IP 限制 | ❌否 | ✅是 | ✅是 | ✅是 | ✅是 |
计费
计划 | 详细信息 |
---|---|
消耗计划 | 只需为函数运行时间付费。 账单将基于执行数量、执行时间和所用内存。 |
高级计划 | 高级计划基于在必需实例和预热实例中使用的核心秒数和内存。 每个计划必须至少有一个实例始终处于预热状态。 此计划提供了最可预测的定价。 |
专用计划 | 应用服务计划中函数应用的费用与其他应用服务资源(例如 Web 应用)的费用相同。 |
应用服务环境 (ASE) | ASE 每月会产生统一的基础结构使用费,该费率不会随 ASE 大小的变化而改变。 每个应用服务计划 vCPU 也会产生费用。 ASE 中托管的所有应用都在“隔离”定价 SKU 中。 |
Kubernetes | 只需支付 Kubernetes 群集的费用;Functions 无额外费用。 函数应用作为应用程序工作负荷在群集之上运行,就像普通应用一样。 |