你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure Functions是一种事件驱动的计算服务,它运行少量代码块,或者运行函数,而无需显式基础结构预配或管理。 函数可以响应 HTTP 请求、计时器、队列消息和其他Azure服务中的更改等事件。 此功能使 Functions 非常适合数据处理、系统集成和后台任务。
使用 Azure 时,可靠性是共同的责任。 Microsoft提供了一系列功能来支持复原和恢复。 你负责了解这些功能如何在你使用的所有服务中工作,并选择满足业务目标和运行时间目标所需的功能。
本文介绍如何使 Functions 能够灵活应对各种潜在的中断和问题,包括暂时性故障、可用性区域故障和区域范围的故障。 它还突出显示有关 Functions 服务级别协议(SLA)的关键信息。
生产部署建议
Azure Well-Architected 框架提供有关可靠性、安全性、成本、作和性能的建议。 若要了解这些领域如何相互影响并有助于可靠的 Functions 解决方案,请参阅 Functions 的体系结构最佳做法。
可靠性体系结构概述
部署 Functions 时,请务必熟悉以下概念:
托管计划: 计划表示函数应用的托管环境。 该计划确定可用的计算资源、定价模型和缩放行为。
存储帐户: 创建函数应用时,必须指定主机存储帐户。 存储帐户管理函数应用内部操作的各个方面,包括函数代码存储、日志记录和并发管理(例如特定触发器类型的 Blob 租约)。
还可以使用存储帐户进行部署。 此存储帐户可能与主机存储帐户或其他存储帐户相同。
重要
存储帐户是 Functions 可靠性体系结构的关键部分。 配置它们以满足函数应用的复原能力要求。
触发器和绑定: 触发器和绑定允许函数响应事件、接收来自其他服务的数据,并将数据写入其他服务。
持久函数: Durable Functions 是 Functions 的一项功能。 它提供有状态功能,例如长时间运行的编排功能和有状态实体。
使用持久函数时,请配置存储状态的 存储提供程序 。 评估所选状态存储的可靠性特征,并将其配置为满足复原能力要求。
暂时性故障的复原能力
暂时性故障是指组件发生短暂的间歇性故障。 这些故障经常出现在云之类的分布式环境中,在运营过程中比较常见。 暂时性故障在短时间内自行纠正。 应用程序通常可以通过重试受影响的请求来处理暂时性故障,这一点很重要。
与任何云托管的 API、数据库和其他组件通信时,所有云托管的应用程序都应遵循 Azure 暂时性故障处理指南。 有关详细信息,请参阅有关处理暂时性故障的建议。
请考虑以下建议来处理函数应用中的暂时性故障:
触发器和绑定: Functions 平台包括触发器和绑定的内置暂时性故障处理。 当支持的触发器触发或支持的绑定读取或写入数据时发生暂时性故障时,平台可以自动重试该操作。 此内置重试行为可确保临时连接问题或服务中断不会阻止函数运行。 有关详细信息,请参阅 Functions 错误处理和重试。
此保护仅涵盖暂时性故障。 平台不会重试永久性故障,例如配置错误的连接字符串或已删除的资源。
平台将永久性故障和重复的暂时性故障视为错误。 配置日志记录以捕获有关函数执行错误的信息。 有关详细信息,请参阅 为 Functions 配置监视。
函数代码: 在函数代码中,你负责在函数调用外部服务时处理暂时性故障。 根据函数代码中发出的外部服务调用,实现重试逻辑、超时和断路器模式。 尽可能将函数设计为幂等函数,以便重试不会产生重复的副作用。
客户: 同步连接到函数的客户端应用程序(例如通过 HTTP 连接)应对暂时性故障保持稳定性。
应对可用区故障的弹性
可用性区域 是 Azure 区域内物理上独立的数据中心组。 当某个区域发生故障时,服务可以切换到其他可用的区域。
消耗计划不支持可用性区域。 如果您的工作负荷需要区域冗余,建议改用弹性消费、高级版或专用(Azure 应用服务)计划。
弹性消耗计划支持区域冗余部署。
高级方案支持区域冗余部署。
启用区域冗余后,平台会自动将计划实例分散到所选区域的所有可用性区域。 如果区域中的任何可用性区域出现问题,函数将继续使用正常区域中的实例运行。
必须在主机存储帐户上启用区域冗余存储(ZRS),以确保其对区域中断具有弹性。
此图显示了三个可用性区域。 每个区域都包含一个 Functions 实例。 ZRS 帐户跨越所有三个可用性区域。
专用(应用服务)计划支持区域冗余部署。 启用区域冗余后,平台会自动将实例分散到所选区域的所有可用性区域。 在计划上配置区域冗余。 有关如何Azure 应用服务处理区域冗余的详细信息,请参阅应用服务中的可恢复性。
如果未启用区域冗余,则计划是 非区域 或 区域性 计划。 平台可以将计划实例放置在该区域或同一区域中的任何可用性区域中。 计划实例无法抵御可用区故障。 在该区域的任何区域发生中断期间,你的计划可能会遇到停机。
要求
- 区域支持: 可以将区域冗余弹性消耗计划部署到一组特定的区域。 可以使用 Azure CLI 检索受支持区域的当前列表。 有关详细信息,请参阅 查看支持可用性区域的区域。
区域支持: 您可以将区域冗余的高级计划部署到以下区域。
美洲 欧洲 中东 Africa 亚太 Brazil South 法国中部 以色列中部 南非北部 Australia East 加拿大中部 德国中西部 卡塔尔中部 印度中部 美国中部 意大利北部 阿拉伯联合酋长国北部 中国北部 3 美国东部 北欧 东亚 美国东部 2 挪威东部 日本东部 美国中南部 瑞典中部 东南亚 西部美国 2 瑞士北部 美国西部 3 英国南部 西欧 Operating systems: 该平台支持部署区域冗余Windows和 Linux 计划。
最小实例计数: 高级计划的区域冗余至少需要两个始终就绪的实例。
- 主机存储帐户: 必须将函数应用的默认主机存储帐户配置为使用 ZRS。 如果使用未配置为 ZRS 的主机存储账户,则应用程序在发生区域中断期间可能会行为异常。
- 部署容器存储帐户: 如果对应用的部署容器使用单独的存储帐户,请将其更新为区域冗余。
注意事项
非运行时间行为: 区域冗余仅保证已部署应用程序的持续运行时间。 可用性区域中断可能会影响 Functions 的各个方面,即使应用程序继续为流量提供服务。 这些行为包括计划缩放、应用程序创建、应用程序配置和应用程序发布。
跨区域的实例分布
将 Flex Consumption 计划应用配置为区域冗余时,平台会自动将计划实例分散到所选区域中的多个区域,针对始终就绪实例和按需实例使用不同的规则:
始终可用的实例 使用轮询分配机制分布在至少两个区域内。
为了确保区域复原能力,无论应用的始终就绪配置如何,平台都会为每个 函数缩放函数或组自动维护至少两个始终就绪的实例。 平台创建的实例是平台管理的,按始终就绪实例计费,并且不会更改始终就绪的配置设置。
按需实例 是因应用需要扩展超出始终可用实例数量时,由事件源数据量产生的。 按需实例在可用性区域内根据尽力原则进行分布。 平台优先考虑更快的横向扩展,而不是区域内的均匀分布。 平台会尝试随着时间的推移平衡分配。
将 Elastic Premium 函数应用计划配置为区域冗余时,平台会自动将计划实例分散到所选区域中的多个区域。 实例分布遵循以下规则,即使应用缩减和扩展:
最小函数应用实例计数为 2。
如果指定容量大于区域数,则仅当容量是区域数的倍数时,实例才会均匀分布。
对于大于区域数乘以实例数的容量值,额外的实例分布在其余区域。
当 Functions 将实例分配给区域冗余高级计划时,它使用基础Azure 虚拟机规模集提供的最费力区域均衡。 Azure认为一个高级计划为均衡,当每个区域与计划中的其他区域具有相同数量的虚拟机(VM),可多或少一个 VM。
Cost
启用区域冗余时不会产生额外费用。 区域冗余计划的定价与单区域计划相同。 但是,启用区域冗余功能会影响计划中最小实例数。
如果在包含少于两个实例的计划上启用可用性区域,则平台会针对该计划强制实施至少两个实例计数,并且这两个实例都收费。
有关完整定价详细信息,请参阅 Functions 定价。
配置可用性区域支持
创建新的区域冗余函数计划。 创建新计划时,可以启用区域冗余。 有关详细信息,请参阅 创建区域冗余函数应用。
在现有计划中启用区域冗余。 您可以为现有的 Elastic Premium 计划启用或禁用可用区域。 Elastic Premium 计划具有与专用(应用服务)计划不同的特定容量行为特征,并且需要额外的配置步骤。 有关详细步骤,请参阅 对现有计划启用区域冗余。
创建新的区域冗余函数计划。 创建新计划时,可以启用区域冗余。 有关详细信息,请参阅 创建区域冗余函数应用。
在现有计划中启用区域冗余。 对于高级计划,只能在创建计划期间启用区域冗余。 无法将现有高级计划转换为区域冗余计划。 而是通过在新的高级计划应用上创建并行部署来迁移应用。 有关详细信息,请参阅 对现有计划启用区域冗余。
容量计划和管理
即使区域中的区域遇到中断,区域冗余函数应用也会继续运行。
在区域中断期间,Functions 会检测丢失的实例,并自动尝试在正常区域中查找或创建替换实例。 该平台尽最大努力地执行此过程,不能保证成功。 如果您的工作负载需要特定数量的实例来维持预期的服务水平,请考虑对始终可用的实例数量进行适度的超额配置。 过度预配可让解决方案容忍容量丢失并继续正常运行,而不会降低性能。 有关详细信息,请参阅 通过过度预配管理容量。
所有区域正常时的行为
本部分介绍当计划是区域冗余、主机存储帐户使用 ZRS 以及所有可用性区域都正常运行时会发生什么情况。
跨区域操作: 在 Functions 上配置区域冗余时,请求会自动分布在每个可用性区域中的实例中。 请求可能会转到任何可用性区域中的任何实例。
跨区域数据复制: 函数是无状态计算服务,因此区域之间没有要复制的数据。 平台会自动跨区域复制配置。
如果主机存储帐户使用 ZRS,Azure 存储会同步跨多个可用性区域复制其数据。
对于持久函数,请查看存储提供程序,了解如何跨区域复制数据。
区域故障期间的行为
本部分介绍当计划是区域冗余、主机存储账户使用 ZRS 并且发生可用性区域故障时会发生什么情况。
- 检测和响应: Functions 平台负责检测可用性区域中的故障。 无需启动区域故障转移。
- 通知:当区域关闭时,Microsoft不会自动通知你。 但是,可以使用 Azure 资源运行状况 监视单个资源的运行状况,并且可以设置 资源运行状况警报 来通知问题。 还可以使用 Azure 服务运行状况 来了解服务的总体运行状况,包括任何区域故障,还可以设置 服务运行状况警报 来通知问题。
活动请求: 当可用性区域不可用时,连接到故障可用性区域中的实例的正在进行的请求将终止,必须重试。 按照 暂时性故障处理指南确保应用程序已准备好。
预期数据丢失: 区域故障不应导致数据丢失,因为 Functions 是无状态服务。
如果存储帐户使用 ZRS,存储将确保即使发生区域故障也不会丢失数据。
对于持久函数,请查看存储提供程序,了解在发生区域故障期间是否可能发生数据丢失。
预期的停机时间: 在区域中断期间,连接可能会遇到短暂的中断,这些中断通常持续几秒钟,因为流量被重新分发。 按照 暂时性故障处理指南确保应用程序已准备好。
流量重新路由: 函数从该区域检测丢失的实例,并尝试查找新的替换实例。 Functions 找到替换项后,会根据需要跨新实例分配流量。
重要
在区域发生故障的情况下,Azure 不保证可以成功请求更多实例。 平台会尝试尽最大努力回填丢失的实例。 如果在可用性区域故障期间需要保证容量,请创建并配置计划,通过过度预配容量来补偿区域损失。
非运行时间行为: 即使可用性区域遇到服务中断,区域冗余函数应用计划中的应用程序也会继续运行并提供流量。 但是,在可用性区域中断期间,非运行时间行为可能会受到影响。 这些行为包括函数应用缩放、应用程序创建、应用程序配置和应用程序发布。
区域恢复
当可用性区域恢复时,Functions 会自动还原可用性区域中的实例,删除在其他可用性区域中创建的临时实例,并按正常方式重新路由实例之间的流量。
测试区域故障
Functions 平台管理区域冗余资源的流量路由、故障转移和区域恢复。 你不需要开始任何事情。 Azure完全管理此功能,因此无需验证可用性区域故障进程。
对区域范围的故障的复原能力
Functions 是单区域服务。 如果区域不可用,则 Functions 资源也不可用。
用于复原的自定义多区域解决方案
为了避免在区域范围的服务中断期间发生中断,您可以冗余地将相同的函数部署到多个区域的函数应用中。
你负责:
将函数应用部署到多个区域。
管理区域之间的流量分布。
实现故障转移机制。
确保跨区域的数据一致性(如果适用)。
监视和管理跨区域部署。
在多个区域中运行相同的函数代码时,请考虑 主动-主动 和 主动-被动 模式。 以下部分介绍了这些模式,但不提供详细的指导或配置步骤。
HTTP 触发器函数的主动-主动模式
在主动-主动模式中,两个区域中的函数都以重复方式或轮换方式主动运行和处理事件。 将主动-主动模式与 Azure Front Door 结合使用,用于关键 HTTP 触发的函数,这些函数可以在多个区域中运行的函数之间路由和轮循 HTTP 请求。 Azure Front Door 还可以定期检查每个终结点的运行状况。 如果一个区域中的函数停止响应健康检查,Azure Front Door将其从负载均衡中删除,并且仅将流量转发到剩余的健康的函数。
该图显示的是 Azure Front Door 位于顶部。 下面显示了两个区域:左侧的主要区域和右侧的次要区域。 每个区域都包含一个 Functions 应用和一个数据库。 箭头从Azure Front Door指向这两个函数应用。 每个函数应用上都有箭头指向其各自的数据库。
非 HTTP 触发器函数的主动-被动模式
对于事件驱动的非 HTTP 触发函数(如Azure 服务总线和Azure 事件中心触发器),请使用主动-被动模式。 在主动-被动模式中,函数实例在接收事件的区域中运行,而次要区域中的实例保持空闲状态。 此模式可确保只有一个函数处理每个消息,这有助于保持数据一致性。 它还提供了一种在发生灾难(如区域中断)时切换到备用区域的方法。
考虑函数应用的灾备切换以及你使用的其他服务的灾备切换机制,例如:
请考虑一个使用 Event Hubs 触发器的示例拓扑,其中您的 Event Hubs 命名空间已配置用于异地灾难恢复。 在这种情况下,主动-被动模式需要以下组件:
事件中心命名空间被部署到主要和次要区域。
启用了异地灾难恢复 以配对主事件中心和辅助事件中心。 此配置还会创建一个 别名 ,该别名可用于连接到事件中心命名空间,并将别名从主命名空间切换到辅助数据库,而无需更改连接信息。
部署到主要和次要区域的函数应用程序。 次要区域中的应用保持空闲状态,因为它不会接收消息。
每个函数应用的触发器对其各自的 Event Hubs 命名空间使用 direct(nonalias)连接字符串。
事件中心命名空间的发布者将发布到别名连接字符串。
此图显示了左侧的主要区域和右侧的次要区域。 主要区域包含活动事件中心命名空间、函数应用和数据库。 次要区域包含被动事件中心命名空间、函数应用和数据库。 一个箭头从别名指向事件中心异地灾难恢复机制,它连接了主事件中心命名空间和辅助事件中心命名空间。 箭头从每个事件中心指向其各自的函数应用。 每个函数应用都有一个箭头指向其各自的数据库。
在故障转移之前,将事件发送到共享别名的发布者会把流量路由至主事件中心。 主函数应用以独占方式侦听主事件中心。 辅助函数应用保持被动和空闲状态。
故障转移启动时,向共享别名发送事件的发布者将路由到辅助事件中心。 辅助函数应用变为活动状态,并自动触发。 事件中心可以驱动整个故障转移过程,并且每个函数应用仅在其相应的事件中心处于活动状态时运行。
Durable Functions(耐用函数)
有关持久函数的多区域灾难恢复,请参阅 Azure 持久函数中的灾难恢复和异地分布。
服务维护期间的系统弹性能力
函数执行常规服务升级和其他维护任务。
- 暂时性故障复原能力: 在服务维护期间,运行函数应用的实例可能会重启或遇到临时中断。 确保与函数应用交互的客户端应用程序 对暂时性故障具有抗扰性。
- 启用区域冗余: 在计划中启用区域冗余时,还可以在平台更新期间提高复原能力。 在计划中部署多个实例,并为计划启用区域冗余会增加额外的复原层(如果某个实例或某个区域在升级期间运行不正常)。
额外的临时实例: 为了在升级期间保持预期容量,平台会在升级过程中自动添加计划的额外实例。
启用区域冗余: 在计划中启用区域冗余时,还可以在平台更新期间提高复原能力。 更新域由更新期间脱机的 VM 集合组成,它们映射到可用性区域。 在您的计划中部署多个实例并为计划启用区域冗余,可以在升级过程中当某个实例或区域状态异常时,增加一层额外的恢复能力。
应用服务环境: 如果在应用服务环境中托管函数应用,则可以自定义升级周期。 如果必须验证升级对工作负荷的影响,请启用手动升级。 在将升级应用到生产实例之前,使用此方法验证并测试非生产实例。
有关维护首选项的详细信息,请参阅 应用服务环境计划内维护的升级首选项。
应用程序部署的复原能力
应用程序部署引入了生产环境中存在问题的风险。 如果更新导致问题,随时准备回滚更新。 控制更新的推出方式,以减少应用程序重启中断。
弹性消耗计划支持 站点更新策略,提供多种部署应用更新的方法。 这些策略包括零停机部署的滚动更新。
函数部署槽位可实现函数应用的零停机时间部署。 使用部署槽位最大程度地减少对用户的部署和配置更改的影响。 部署槽位也会降低应用程序重启的可能性。 应用程序重启会导致暂时性故障。
服务级别协议
Azure服务的服务级别协议(SLA)描述了每个服务的预期可用性以及解决方案必须满足的条件,以实现该可用性预期。 有关详细信息,请参阅 联机服务的 SLA。
函数为消耗计划和其他计划类型提供不同的可用性 SLA。