Compartir a través de

Azure Functions 的可靠性

Azure Functions 是一种事件驱动的计算服务,可让你运行小块代码(函数),而无需显式预配或管理基础结构。 函数可以响应 HTTP 请求、计时器、队列消息和其他 Azure 服务中的更改等事件,使其非常适合处理数据、集成系统和运行后台任务。

使用 Azure 时,可靠性是共同的责任。 Azure 提供了一系列支持复原和恢复的功能。 你负责了解这些功能如何在你使用的所有服务中工作,并选择满足业务目标和运行时间目标所需的功能。

本文介绍如何增强 Azure Functions 的韧性,以应对各种潜在的中断和问题,包括瞬时故障、可用性区域故障和整个区域范围的故障。 它还重点介绍了有关 Azure Functions 服务级别协议(SLA)的关键信息。

生产部署建议

Azure Well-Architected Framework 提供了关于可靠性、性能、安全性、成本和操作的建议。 若要了解这些领域如何相互影响,并为可靠的 Azure Functions 解决方案做出贡献,请参阅 Azure Functions 的体系结构最佳做法

可靠性体系结构概述

部署 Azure Functions 时,请务必熟悉以下几个概念:

  • 托管计划 计划表示函数应用的托管环境。 计划确定可用的计算资源、定价模型和缩放行为。

  • 存储帐户 创建函数应用时,必须指定主机存储帐户。 存储帐户用于管理函数应用内部操作的各个方面,包括函数代码存储、日志记录和并发管理(例如某些触发器类型的 Blob 租约)。

    还可以使用存储帐户进行部署。 此存储帐户可能与主机存储帐户或其他存储帐户相同。

    Important

    存储帐户是 Azure Functions 可靠性体系结构的关键部分,应将其配置为满足函数应用的复原要求。

  • 触发器和绑定:这些函数使函数能够响应来自其他服务的事件、接收和写入数据。

  • Durable Functions 持久函数是有状态函数,包括长时间运行的业务流程和有状态实体。

    使用 Durable Functions 时,请配置存储服务提供商,用于存储状态。 你需要评估所选状态存储的可靠性特征,并将其配置为满足复原能力要求。

暂时性故障的复原能力

暂时性故障是指组件发生短暂的间歇性故障。 这些故障经常出现在云之类的分布式环境中,在运营过程中比较常见。 暂时性故障在短时间内自行纠正。 应用程序通常可以通过重试受影响的请求来处理暂时性故障,这一点很重要。

与任何云托管的 API、数据库和其他组件通信时,所有云托管的应用程序都应遵循 Azure 暂时性故障处理指南。 有关详细信息,请参阅有关处理暂时性故障的建议

请考虑以下建议来处理函数应用中的暂时性故障:

  • 触发器和绑定: Azure Functions 平台包括针对许多触发器和绑定的内置暂时性故障处理。 当触发支持的触发器或支持的绑定正在读取或写入数据时发生暂时性故障时,平台可以自动重试该操作。 此内置重试行为有助于确保临时连接问题或服务故障不会阻止函数执行。 有关详细信息,请参阅 Azure Functions 错误处理和重试

    但是,此保护仅涵盖暂时性故障。 不会重试永久性失败,例如配置错误的连接字符串或已删除的资源。

    永久性故障和重复的暂时性故障被视为错误,你可以配置日志记录以捕获有关函数执行错误的信息。 有关详细信息,请参阅如何配置对 Azure Functions 的监视

  • 函数代码: 在函数正文中,负责在调用外部服务时处理暂时性故障。 应根据函数代码中的外部服务调用需求,适当实现重试逻辑、超时设置和断路器模式。 尽可能将函数设计为幂等函数,以便重试不会导致重复的副作用。

  • 客户: 任何通过 HTTP 连接等方式同步连接到函数的客户端应用程序,都应该能够抵御暂时性故障。

应对可用区故障的弹性

可用性区域 是 Azure 区域内物理上独立的数据中心组。 当一个区域发生故障时,服务可以切换到其他可用的区域之一。

消耗计划不支持可用性区域。 如果区域冗余是工作负荷的要求,请考虑改用弹性消耗计划、高级计划或专用(应用服务)计划类型。

高级方案支持区域冗余部署。

启用区域冗余后,平台会自动将计划实例分散到所选区域的所有可用性区域。 如果区域中的任何可用性区域出现问题,函数将继续使用正常区域中的实例运行。

还必须在主机存储帐户上启用区域冗余存储(ZRS),以确保其能够抵御区域故障。

关系图展示具有区域冗余的 Azure Functions 方案,其中三个实例分布在三个区域,以及一个区域冗余存储帐户。

专用(应用服务)计划支持区域冗余部署。 启用区域冗余后,平台会自动将实例分散到所选区域的所有可用性区域。 在计划上配置区域冗余。 有关应用服务如何处理区域冗余的完整详细信息,请参阅 Azure 应用服务中的可靠性

如果未启用区域冗余,则计划为 非区域区域,这意味着计划实例可能放置在该区域或同一区域中的任何可用性区域中,并且它们无法复原到可用性区域故障。 在该区域的任何区域发生中断期间,你的计划可能会遇到停机。

要求

  • 区域支持: 区域冗余高级计划可以部署到以下区域:

    亚太
    中国北部 3
  • 操作系统: 支持 Windows 和 Linux 计划。

  • 最小实例计数: 为高级计划启用区域冗余时,至少需要两个始终就绪的实例。

  • 主机存储帐户:必须将函数应用的默认主机存储帐户配置为使用区域冗余存储(ZRS)。 如果使用的主机存储帐户未配置 ZRS,您的应用程序在发生区域故障期间可能会意外地运行。

注意事项

区域冗余仅保证已部署应用程序的持续运行时间。 可用性区域中断可能会影响 Azure Functions 的某些方面,即使应用程序继续为流量提供服务。 这些行为包括计划缩放、应用程序创建、应用程序配置和应用程序发布。

跨区域的实例分布

将 Elastic Premium 函数应用计划配置为区域冗余时,平台会自动将计划实例分散到所选区域中的多个区域。 实例分布遵循以下规则,即使应用缩减和扩展:

  • 最小函数应用实例计数为 2。
  • 如果指定容量大于区域数,则仅当容量是区域数的倍数时,实例才会均匀分布。
  • 对于容量值超过区域数 * 实例数,额外实例分布在剩余区域之间。

当 Functions 将实例分配给区域冗余 Premium 计划时,它使用 Azure 虚拟机规模集提供的尽力而为区域平衡。 如果每个区域在高级计划使用的其他所有区域中具有相同数量的虚拟机,或者减去一个虚拟机,则高级计划被视为 均衡 计划。

Cost

没有与启用区域冗余相关的额外费用。 区域冗余计划的定价与单区域计划相同。

但是,如果在少于两个实例的计划上启用可用性区域,则平台会针对该计划强制实施两个实例的最小实例计数,并且需要为这两个实例付费。

有关完整定价详细信息,请参阅 Azure Functions 定价

配置可用性区域支持

  • 创建新的区域冗余 Azure Functions 计划。 创建新计划时,可以启用区域冗余。 有关详细步骤,请参阅 创建区域冗余函数应用

  • 对现有计划启用区域冗余: 对于高级计划,只能在创建计划期间启用区域冗余。 无法将现有高级套餐转换为具备区域冗余性的套餐。 您必须通过在新的 Premium 计划应用上创建并行部署,来迁移您的应用。 有关详细信息,请参阅 对现有计划启用区域冗余

容量计划和管理

即使区域中的区域发生中断,区域冗余函数应用也会继续运行。

在区域中断期间,Azure Functions 会检测丢失的实例,并自动尝试在正常的区域中查找或创建替换实例。 此过程是尽最大努力完成的,不能保证。 如果您的工作负荷必须具有一定数量的实例来维护预期的服务级别,请考虑为始终可用实例数进行超额配置。 此方法允许解决方案容许某些容量丢失并继续正常运行,而不会降低性能。 有关详细信息,请参阅使用过度预配管理容量

所有区域正常时的行为

本节概述计划在实现区域冗余、主机存储帐户使用 ZRS 且所有可用性区域正常运行时的预期情况。

  • 跨区域操作: 在 Azure Functions 上配置区域冗余时,请求会自动分布在每个可用性区域中的实例中。 请求可能会转到任何可用性区域中的任何实例。

  • 跨区域数据复制: Azure Functions 是无状态计算服务,因此区域之间没有客户数据可复制。 平台会自动跨区域复制配置。

    如果主机存储帐户使用 ZRS,Azure 存储会同步跨多个可用性区域复制其数据。

    对于 Durable Functions,请查看存储服务提供商,了解它如何在不同区域之间复制数据。

区域故障期间的行为

本部分介绍当计划为区域冗余时会发生什么情况,主机存储帐户使用 ZRS,并且存在可用性区域中断的情况。

  • 检测和响应: Azure Functions 平台负责检测可用性区域中的故障。 无需执行任何操作即可启动区域故障转移。
  • 活动请求: 当可用性区域不可用时,连接到故障可用性区域中实例的任何正在进行的请求都将终止,需要重试。 按照 暂时性故障处理指南确保应用程序已准备好。

  • 预期数据丢失: 区域故障不应导致数据丢失,因为 Azure Functions 是无状态服务。

    如果主机存储帐户使用 ZRS,Azure 存储可确保区域故障不会丢失任何数据。

    对于 Durable Functions,请查看您的存储提供程序,以了解在区域故障发生期间是否可能出现数据丢失。

  • 预期的停机时间: 在区域中断期间,连接可能会遇到短暂的中断,这些中断通常持续几秒钟,因为流量被重新分发。 按照 暂时性故障处理指南确保应用程序已准备好。

  • 流量重新路由: Azure Functions 会检测该区域丢失的实例,并尝试查找新的替换实例。 Azure Functions 找到替换项后,会根据需要跨新实例分配流量。

    Important

    在区域发生故障的情况下,Azure 不保证可以成功请求更多实例。 平台会尝试尽最大努力回填丢失的实例。 如果在可用性区域故障期间需要有保证的容量,请创建并配置计划,以通过过度预配容量来考虑区域损失。

  • 非运行时间行为: 即使可用性区域遇到服务中断,区域冗余函数应用计划中的应用程序也会继续运行并提供流量。 但是,在可用性区域中断期间,非运行时间行为可能会受到影响。 这些行为包括函数应用缩放、应用程序创建、应用程序配置和应用程序发布。

区域恢复

当可用性区域恢复时,Azure Functions 会自动还原可用性区域中的实例,删除在其他可用性区域中创建的任何临时实例,并按正常方式重新路由实例之间的流量。

测试区域故障

Azure Functions 平台管理区域冗余资源的流量路由、故障转移和区域恢复。 你不需要开始任何事情。 由于此功能是完全管理的,因此无需验证可用区故障处理流程。

对区域范围的故障的复原能力

Azure Functions 是单区域服务。 如果区域不可用,则 Azure Functions 资源也不可用。

用于复原的自定义多区域解决方案

为了避免中断期间执行丢失,可以通过冗余方式将相同的函数部署到多个区域的函数应用。

你负责:

  • 将函数应用部署到多个区域
  • 管理区域之间的流量分布
  • 实现故障转移机制
  • 确保跨区域的数据一致性(如果适用)
  • 监视和管理跨区域部署

在多个区域中运行相同的函数代码时,可以考虑两种常用模式:主动-主动和主动-被动。 以下部分简要介绍了这些模式,但不提供详细的指导或配置步骤。

HTTP 触发器函数的主动-主动模式

使用主动-主动模式时,两个区域中的函数都以重复或轮流的方式主动运行和处理事件。 应将活动-活动模式与Azure Front Door结合使用,用于关键的 HTTP 触发函数,这些函数可以在多个区域中运行,并在这些区域之间路由和轮询 HTTP 请求。 Azure Front Door 还可以定期检查每个终结点的运行状况。 如果一个区域中的函数停止响应运行状况检查,Azure Front Door 会将其从轮换中取出,并且只会将流量转发到剩余的正常函数。

此图显示了一个示例主动-主动体系结构,其中 Azure Front Door 在不同区域中的 Azure Functions 应用之间路由,每个应用都有自己的数据库。

非 HTTP 触发器函数的主动-被动模式

对于事件驱动的非 HTTP 触发函数(例如服务总线和事件中心触发的函数),请使用主动-被动模式。 使用主动-被动模式,函数在接收事件的区域中主动运行,而第二个区域中的相同函数保持空闲状态。 主备模式提供了一种方法,使每个消息仅由一个函数处理,这对于维护数据的一致性至关重要,同时提供了一种在区域中断等灾难情况下故障转移到次要区域的机制。

函数应用故障转移需要考虑其他服务的故障转移行为,例如:

请考虑使用 Azure 事件中心触发器的示例拓扑,其中为事件中心命名空间配置了异地灾难恢复。 在这种情况下,主动-被动模式需要以下组件:

  • Azure 事件中心已同时部署到主要区域和次要区域。
  • 启用了异地灾难恢复 以配对主事件中心和辅助事件中心。 这还会创建一个 别名 ,可用于连接到事件中心命名空间,并在不更改连接信息的情况下从主命名空间切换到辅助命名空间。
  • 部署到主要区域和次要区域(故障转移)区域的函数应用,次要区域中的应用基本上处于空闲状态,因为消息不会在那里发送。
  • 函数应用程序在其各自的 Event Hubs 命名空间的直接(非别名)连接字符串上触发。
  • 事件中心命名空间的发布者应发布到别名连接字符串。

此图显示了一个示例主动-被动体系结构,事件中心异地灾难恢复跨越多个区域,以及每个区域中的单独函数应用和数据库。

在故障转移之前,发送到共享别名的发布服务器将路由到主事件中心。 主要函数应用程序专门侦听主事件中心。 次要函数应用处于被动和空闲状态。

启动故障转移后,发送到共享别名的发布者会路由到备用事件中心。 辅助功能应用程序现在变为活跃状态并开始自动触发。 有效的故障转移到次级区域可以完全由事件中心驱动,并且仅当相应的事件中心活跃时,相关功能才会激活。

Durable Functions(耐用函数)

有关 Durable Functions 的多区域灾难恢复,请参阅 Azure Durable Functions 中的灾难恢复和异地分发

服务维护期间的系统弹性能力

Azure Functions 执行常规服务升级和其他维护任务。

  • 暂时性故障复原能力: 在服务维护期间,可能会重启运行函数应用的实例,或者遇到临时中断。 确保与函数应用交互的任何客户端应用程序都 能够应对暂时性故障

为了在升级期间保持预期容量,平台会在升级过程中自动添加计划的额外实例。

  • 启用区域冗余: 在计划中启用区域冗余时,还可以在平台更新期间提高复原能力。 更新域由更新期间脱机的 VM 集合组成,它们映射到可用性区域。 在您的计划中部署多个实例,并为计划启用可用区冗余,在升级期间当一个实例或可用区出现故障时,将增加额外的弹性。
  • 应用服务环境: 如果在应用服务环境中托管函数应用,则可以自定义升级周期。 如果需要验证升级对工作负荷的影响,请启用手动升级。 此方法允许在将非生产实例应用到生产实例之前对非生产实例执行验证和测试。

    有关维护首选项的详细信息,请参阅 应用服务环境计划内维护的升级首选项

应用程序部署的复原能力

应用程序部署将问题的风险引入生产环境。 如果更新导致问题,则应准备好回滚更新。 还应控制更新的推出方式,以最大程度地减少应用程序重启中断。

Azure Functions 部署插槽 可实现函数应用的零停机时间部署。 使用部署槽位最大程度地减少对用户的部署和配置更改的影响。 部署槽位也会降低应用程序重启的可能性。 重启应用程序会导致暂时性故障。

服务级别协议

Azure服务的服务级别协议(SLA)描述了每个服务的预期可用性以及解决方案必须满足的条件,以实现该可用性预期。 有关详细信息,请参阅 联机服务的 SLA

Azure Functions 为消耗计划和其他计划类型提供不同的可用性 SLA。