Compartilhar via

Azure Functions的可靠性最佳实践

Azure Functions是一种事件驱动的按需计算服务,用于扩展现有Azure App Service应用程序平台。 它添加了实现由Azure、合作伙伴服务和本地系统中发生的事件触发的代码的功能。 通过使用 Functions,可以生成连接到数据源或消息解决方案的解决方案,从而更轻松地处理和响应事件。 函数在Azure数据中心运行,这些数据中心具有许多集成组件,因此非常复杂。 在托管云环境中,VM 偶尔可以重启或移动,并且系统升级会发生。 函数应用还可能依赖于外部 API、Azure Services 和其他数据库,这些数据库也容易定期无法正常工作。

本文详细介绍了有关设计和部署在基于云的环境中保持正常状态和良好性能的高效函数应用的一些最佳做法。

选择正确的托管计划

在Azure中创建函数应用时,必须为应用选择托管计划。 选择的计划会影响性能、可靠性和成本。 Azure Functions提供以下托管计划:

如有可能,请使用 Flex 消耗层级托管你的动态扩展应用。

在 App Service 平台的上下文中,动态托管函数的 Premium 计划是弹性 Premium 计划(EP)。 其他专用(App Service)计划被称为 “Premium” 。 有关详细信息,请参阅 Azure Functions Premium 计划

选择的托管计划决定了以下行为:

  • 函数应用如何按需缩放以及如何管理实例分配。
  • 每个函数应用实例可用的资源。
  • 支持高级功能,例如Azure Virtual Network连接。

有关选择正确的托管计划和计划之间的详细比较的详细信息,请参阅Azure Functions托管选项

创建函数应用时选择正确的计划。 Functions 提供有限的能力用于切换托管计划,主要是在消耗型计划和弹性高级计划之间进行切换。 有关详细信息,请参阅 Plan migration

正确配置存储器

函数需要一个存储帐户与函数应用相关联。 Functions 主机使用存储帐户连接来执行管理触发器和记录函数执行等操作。 动态缩放函数应用程序时也会使用它。 有关详细信息,请参阅Azure Functions 存储注意事项

函数应用中配置错误的文件系统或storage帐户可能会影响函数的性能和可用性。 有关排查配置错误存储账户的帮助,请参阅存储故障排除文章。

存储连接设置

动态扩展的函数应用程序可以从存储帐户中的 Azure Files 终结点或与扩展实例关联的文件服务器运行。 此行为由以下应用程序设置进行控制:

  • WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
  • WEBSITE_CONTENTSHARE

Windows 上的高级计划和消耗计划支持这些设置。 弹性消耗计划不需要这些设置,而是通过 Azure Blob 存储容器来托管部署包,而不是通过 Azure 文件共享。

在 Azure portal 或使用 Azure CLI 或 Azure PowerShell 创建函数应用时,可以根据需要为函数应用创建这些设置。 从Azure Resource Manager模板(ARM 模板)创建资源时,还需要在模板中包含 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING

使用 ARM 模板进行首次部署时,请不要包含 WEBSITE_CONTENTSHARE,因为它是自动生成的。

可以使用以下 ARM 模板示例来帮助正确配置这些设置:

重要

Azure Files服务当前不支持基于标识的连接。 Flex Consumption 计划完全支持托管标识。 有关详细信息,请参阅 在没有 Azure Files 的情况下创建应用。

存储账户配置

创建函数应用时,必须创建或链接到支持 Blob 存储、队列存储和表存储的常规用途 Azure Storage 帐户。 函数依赖于Azure Storage来管理触发器和日志记录函数执行等作。 函数应用的存储帐户连接字符串位于 AzureWebJobsStorageWEBSITE_CONTENTAZUREFILECONNECTIONSTRING 应用程序设置中。

创建此storage帐户时,请记住以下注意事项:

  • 若要降低延迟,请在函数应用所在的同一区域中创建storage帐户。

  • 若要提高生产性能,请为每个函数应用使用单独的storage帐户。 Durable Functions和事件中心触发的函数尤其如此。

  • 对于事件中心触发的函数,请勿使用启用了 Data Lake Storage 的帐户。

处理大型数据集

在 Linux 上运行时,可以通过装载文件共享来添加额外的storage。 装载共享可以方便地使函数处理现有的大型数据集。 有关详细信息,请参阅 Mount 文件共享

整理函数

你可能会开发并发布多个函数作为解决方案的一部分。 这些函数通常组合到单个函数应用中,但也可以分别在多个函数应用中运行。 在高级和专用(App Service)托管计划中,多个函数应用还可以在同一计划中运行来共享相同的资源。 对函数和函数应用进行分组的方式可能会影响整体解决方案的性能、缩放、配置、部署和安全性。

对于消费计划和高级计划,函数应用程序中的所有函数会同时进行动态缩放。

有关如何组织函数的详细信息,请参阅函数组织最佳做法

优化部署

部署函数应用时,请记住,Azure中函数的部署单元是函数应用。 你同时在函数应用中部署所有函数,通常来自同一部署包。

要成功完成部署,请考虑采取以下做法:

  • 请让您的函数从部署包中运行。 这种从包运行的方法具有以下优点:

    • 降低文件复制锁定问题的风险。
    • 可以直接部署到生产应用,不会触发重启。
    • 包中的所有文件都可供应用使用。
    • 提高 ARM 模板部署性能。
    • 可能会减少冷启动时间,尤其是对于具有大型 npm 包树的 JavaScript 函数。
  • 对于高级计划托管,请考虑添加预热触发器,以便在添加新实例时减少延迟。 有关详细信息,请参阅Azure Functions预热触发器

  • 若要最大限度减少部署停机时间,请在消费、Premium 和专用计划中使用部署槽。 或者,在 Flex Consumption 计划中,配置滚动更新以实现零停机时间的部署。 有关详细信息,请参阅 Flex Consumption 中的 Azure Functions 部署槽位 站点更新策略

编写可靠的函数

遵循有助于实现函数的一般性能和可用性的设计原则。 这些原则包括:

暂时性故障在云计算中很常见,因此在访问基于云的资源时使用 重试模式。 许多触发器和绑定已实现重试。

优先考虑集成测试,在整个应用程序和构建自动化管道的上下文中,持续测试你的函数。

安全设计

在规划阶段就要考虑安全性,而不要等到功能准备就绪之后。 有关详细信息,请参阅 Securing Azure Functions

考虑并发处理

由于传入事件导致对函数应用程序的需求增加,消耗计划和高级计划会横向扩展这些函数应用程序。 请务必了解函数应用如何响应负载,以及如何配置触发器来处理传入事件。 有关一般概述,请参阅 Azure Functions 中的事件驱动缩放。

专用(App Service)计划要求您为函数应用程序提供扩展或缩减能力。

工作进程计数

在某些情况下,在横向扩展之前,通过在实例中创建多个进程(称为语言工作进程)来处理负载更为高效。 FUNCTIONS_WORKER_PROCESS_COUNT 设置控制允许的最大语言工作进程数。 此设置的默认值为 1,这意味着不使用多个进程。 达到最大进程数后,函数应用会横向扩展到更多实例来处理负载。 此设置不适用于在主机进程中运行的 C# 类库函数

在高级计划或专用(App Service)计划中使用 FUNCTIONS_WORKER_PROCESS_COUNT 时,请考虑计划提供的核心数。 例如,高级计划 EP2 提供两个核心,因此应从 2 值开始,然后根据需要增加两个核心,直到达到最大数目。

触发器配置

规划吞吐量和缩放时,了解不同类型的触发器如何处理事件。 某些触发器允许你控制批处理行为和并发。 调整这些值可以帮助每个实例适当地满足调用函数的需求。 将这些配置选项应用于函数应用中的所有触发器,并在应用的 host.json 文件中维护它们。 有关设置详细信息,请参阅特定触发器引用的“配置”部分。

若要详细了解 Functions 如何处理消息流,请参阅 Azure Functions可靠事件处理

连接规划

连接限制适用于 消耗计划中运行的函数应用。 这些限制适用于每个实例。 由于这些限制以及作为一般最佳实践,建议从您的函数代码中优化出站连接。 有关详细信息,请参阅 Azure Functions 中的管理连接

语言特定的注意事项

对于选择的语言,请注意以下事项:

最大化可用性

冷启动是无服务器体系结构的重要考虑因素。 有关详细信息,请参阅冷启动。 如果冷启动是您场景中关心的问题,请参阅 无服务器冷启动

建议使用灵活消费计划和高级计划,以减少冷启动并保持动态缩放。 使用以下指南来减少冷启动并提高所有托管计划中的可用性。

计划 指南
Flex 计费计划 使用始终就绪的实例使实例保持运行
配置始终就绪的实例数量
高级计划 在函数应用中实现预热触发器
设置始终就绪实例和最大突发限制的值
• 在虚拟网络上使用非HTTP触发器时,使用虚拟网络触发支持
专用计划 至少在启用了 Azure 应用服务运行状况检查的两个实例上运行
实现自动缩放
消耗计划 • 查看您在绑定和触发器中使用的单例模式和并发设置,避免人为地对函数应用的缩放能力施加限制。
查看可能会限制横向扩展的 functionAppScaleLimit 设置
• 在开发和测试期间检查设置的每日使用配额 (GB-Sec) 限制。 考虑在生产环境中消除此限制。

有效监视

Azure Functions 提供与 Azure Application Insights 的内置集成,用于监视函数执行情况以及代码中编写的跟踪信息。 有关详细信息,请参阅 Azure Functions 中的监控执行。 Azure Monitor 还提供用于监视函数应用本身运行状况的设施。 有关详细信息,请参阅 Monitor Azure Functions

使用 Application Insights 集成监视函数时,请注意以下注意事项:

  • 删除 AzureWebJobsDashboard 应用程序设置。 旧版 Functions 支持此设置。 删除 AzureWebJobsDashboard 可提高函数的性能。

  • 查看 Application Insights 日志。 如果您期望查找的数据缺失,请考虑调整采样设置,以便更好地捕获您的监控场景。 使用 excludedTypes 设置从采样中排除某些类型,例如 RequestException。 有关详细信息,请参阅配置采样

Azure Functions还允许将系统生成的日志和用户生成的日志发送到Azure监视器日志。 与 Azure Monitor 日志的集成目前为预览版。

内置冗余

你的业务需求可能要求即使在数据中心服务中断期间,函数也始终保持可用。 若要了解如何使用多区域方法来保持关键函数始终运行,请参阅 Azure Functions 中的 可用性。

后续步骤

管理函数应用