Azure Functions 部署槽位使函数应用能够运行不同的实例(称作“槽位”)。 槽是使用公用终结点公开的不同环境。 一个应用实例始终映射到生产槽,你可以按需交换分配给某个槽的实例。
可用槽位数取决于特定的托管选项:
| 托管选项 | 槽位数(包括生产) |
|---|---|
| 消耗计划 | 2 |
| 高级计划 | 3 |
| 专用(应用服务)计划 | 1-20 |
以下说明反映了交换槽位对函数的影响:
- 流量重定向是无缝的;不会因为交换而丢弃任何请求。 发生这种无缝行为是因为下一个函数触发器将路由到交换槽。
- 当前正在执行的函数在交换期间终止。 如要了解如何编写无状态函数和防御函数,请参阅提高 Azure Functions 的性能和可靠性。
为何使用插槽?
使用部署槽位有很多优点,包括:
- 满足不同用途的不同环境设置:使用不同的插槽可以在交换到生产环境或暂存环境之前区分应用实例。
- 预热:部署到一个槽位而不是直接部署到生产环境可让应用在上线前进行预热。 此外,使用槽可以降低 HTTP 触发的工作负荷的延迟。 实例会在部署前预热,从而降低新部署函数的启动延迟。
- 轻松回退:与生产环境进行交换后,原本放置过渡应用的槽现在包含以前的生产应用。 如果交换到生产槽的更改不符合预期,你可以立即反向交换,以恢复“上次已知正常的实例”。
- 尽量减少重启次数:更改生产槽中的应用设置需要重启正在运行的应用。 可以改为在预备环境中更改设置,然后通过已预热实例将设置更改切换到生产环境。 建议使用插槽在 Functions 运行时版本之间进行迁移,以保持最高的可用性。 有关详细信息,请参阅最少停机时更新。
交换操作
在交换期间,一个槽被视为源,另一个槽被视为目标。 源槽包含应用程序的特定实例,该实例已应用于目标槽。 以下步骤可确保在交换期间目标插槽不会出现停机:
应用设置: 目标槽的设置将应用到源槽的所有实例。 例如,生产设置将应用到测试环境实例。 应用的设置包括以下类别:
等待重启和可用性: 交换操作会等待源槽中的每个实例完成其重启并可用于请求。 如果有任何实例无法重启,交换操作将会还原对源槽所做的所有更改,并停止操作。
更新路由: 如果源槽上的所有实例已成功预热,则两个槽会通过切换路由规则来完成交换。 完成此步骤后,目标槽(例如生产槽)将获得先前已在源槽中预热的应用程序。
重复操作:现在源槽中已经包含之前位于目标槽中的预交换应用,通过应用所有设置并重启实例,完成源槽的相同操作。
请记住以下几点:
在执行交换操作期间的任何时候,已交换应用的初始化将在源槽上发生。 准备源槽时,无论交换是成功还是失败,目标槽都会保持联机。
若要将过渡槽与生产槽交换,请确保生产槽始终是目标槽。 这样,交换操作才不会影响生产应用。
在启动交换之前,必须将与事件源和绑定相关的设置配置为部署槽设置。 提前将它们标记为“粘性”可以确保事件和输出被定向到正确的实例。
在创建新的暂存槽时,无论设置的粘性如何,生产槽中的所有现有设置都会在新槽中被创建。
管理设置
某些配置设置是插槽特有的。 以下列表详细说明了交换槽时,哪些设置会发生变化,哪些设置会保持不变。
槽位专用设置:
- 发布端点
- 自定义域名
- 非公共证书和 TLS/SSL 设置
- 缩放设置
- IP 限制
- Always On
- 诊断设置
- 跨域资源共享 (CORS)
- 专用终结点
非槽特定设置
- 常规设置 - 例如 Framework 版本、32/64 位、Web 套接字
- 应用设置(可以配置为与某个插槽绑定)
- 连接字符串(可以配置为关联到某个槽)
- 处理程序映射
- 公共证书
- 混合连接 *
- 虚拟网络集成 *
- 服务终结点 *
- Azure 内容分发网络 *
根据设计,用星号 (*) 标记的功能不会交换。
注意
应用于不交换的设置的某些应用设置也不交换。 例如,由于诊断设置不会进行切换,因此相关的应用设置(如 WEBSITE_HTTPLOGGING_RETENTION_DAYS 和 DIAGNOSTICS_AZUREBLOBRETENTIONDAYS)也不会进行切换,即使它们未显示为槽位设置也是如此。
创建部署设置
可将设置标记为部署设置,使设置保持不变。 粘性设置不会随应用实例变化。
如果在一个槽中创建部署设置,请确保在交换所涉及的任何其他槽中创建具有唯一值的相同设置。 这样,设置的值不会更改,同时设置名称可在不同的槽之间保持一致。 此名称一致性可确保代码不会尝试访问已在一个槽中定义,但未在另一个槽中定义的设置。
使用以下步骤创建部署设置:
在函数应用中导航到“部署插槽”,然后选择插槽名称。
选择“配置”,然后选择要保留在当前插槽中的设置名称。
选择“部署槽设置”,然后选择“确定”。
设置部分消失后,选择“保存”以保留更改
部署
创建槽时,槽是空的。 可以使用任何支持的部署技术将应用程序部署到槽中。
扩展
所有槽位将缩放到与生产槽位相同的工作者数量。
- 对于 Consumption 计划,插槽会随着函数应用的扩展而变化。
- 对于应用服务计划,应用会扩展到固定数量的工作器。 插槽在与应用计划相同数量的工作线程上运行。
查看插槽
可以使用 Azure CLI 或通过 Azure 门户查看有关现有部署槽的信息。
添加槽
可以使用 Azure CLI 或通过 Azure 门户添加槽。
还可以使用 ARM 模板或 Bicep 文件创建插槽。 有关如何在消费计划中使用部署槽创建函数应用的示例,请参阅此 Azure 资源管理器快速入门。
访问槽资源
访问过渡槽中的资源(HTTP 触发器和管理员终结点)的方式与访问生产槽相同。 但是,您需要在请求的 URL 中使用用于指定部署槽的主机名,而不是函数应用的主机名,同时还需要使用特定于该槽的密钥。 由于过渡槽是实时应用,因此必须在过渡槽中保护函数,就像在生产槽中一样。
交换槽
您可以使用 Azure CLI 或通过 Azure 门户 交换生产和非生产槽位。
回滚交换
如果交换导致出错,或者你想要“撤消”交换,可以回滚到初始状态。 若要恢复到交换前的状态,请再次进行交换以恢复交换前的状态。
删除槽
可以使用 Azure CLI 或通过 Azure 门户 移除插槽。
使用以下步骤从门户中的应用中移除槽:
在函数应用中导航到“部署插槽”,然后选择插槽名称。
选择“删除”。
键入要删除的部署槽的名称,然后选择“删除”。
关闭确认窗格。
更改应用服务计划
对于在应用服务计划中运行的函数应用,可以更改部署槽的基础应用服务计划。
注意
无法在消耗计划下更改槽的应用服务计划。
请按照以下步骤修改实例的应用服务计划:
在函数应用中导航到“部署插槽”,然后选择插槽名称。
在“应用服务计划”下,选择“更改应用服务计划”。
选择要升级到的计划,或创建新的计划。
选择“确定”。
注意事项
Azure Functions 部署槽位具有以下注意事项:
- 应用程序可用的插槽数量取决于计划。 消费计划仅允许一个部署插槽。 其他计划下运行的应用程序可以获得更多可用槽位。 有关详细信息,请参阅服务限制。
- 交换某个槽位会重置那些应用设置等于
files的应用的密钥。 - 启用slots后,函数应用程序会在门户中设置为只读模式。
- 当函数应用使用安全存储帐户作为其默认存储帐户(在
AzureWebJobsStorage中设置)时,槽交换可能会失败。 有关详细信息,请查看WEBSITE_OVERRIDE_STICKY_DIAGNOSTICS_SETTINGS文档。 - 使用短于 32 个字符的函数应用名称。 名称超过 32 个字符会有导致主机 ID 冲突的风险。