Microsoft AZ-204: Azure Functions 与无服务器计算 — 学习指南
属于 Microsoft Azure Developer Associate AZ-204 — 学习指南. 使用经过验证的答案练习: Microsoft 考试中心, 或参加限时模拟考试: ExamRoll.io.
概述
Azure Functions 是一种无服务器计算服务,专为事件驱动和短期工作负载优化。它抽象了基础设施,让您可以专注于编写代码来响应来自 HTTP 端点、队列、Blob、数据变更源和流式处理服务的事件。您可以选择一个托管计划来管理扩展、定价和冷启动行为;通过声明式绑定将代码绑定到触发器和数据源;并可选择使用 Durable Functions 来构建长期运行的可靠工作流。强大的配置、可重复的部署以及通过 Application Insights 实现的深度可观测性,共同完善了该平台,使其适用于生产级系统。
托管计划、扩展和冷启动
选择托管计划决定了执行特性和成本。
消耗计划 (Consumption plan):
- 扩展和定价:按执行次数和资源消耗付费。平台根据事件自动横向扩展。空闲时实例数量会缩减到零。
- 执行限制:对于非 HTTP 函数,函数超时可配置,最长可达 10 分钟;由于客户端连接的限制,HTTP 函数的实际超时时间更短。
- 冷启动:在空闲期后或横向扩展时,新实例初始化会发生冷启动。启动时间取决于语言、依赖项和应用大小。
- 网络/功能:默认支持公共网络。与高级计划 (Premium) 相比,功能集有限(例如,无 VNET 集成)。部署槽不可用。
高级计划 (Premium plan):
- 扩展和定价:根据事件进行扩展,但会保留“预热”实例以消除冷启动。按活动实例和预热实例分配的核心秒数和内存计费。
- 执行限制:执行持续时间几乎无限制(受 HTTP 客户端约束)。推荐用于对延迟敏感或负载较重的工作负载。
- 冷启动缓解:预热实例可保持运行时处于“热”状态。您可以控制每个计划的预热实例数量,从而在突发流量下提供可预测的延迟。
- 网络/功能:支持 VNET 集成、专用终结点、更大的实例规格和部署槽。
专用(App Service)计划 (Dedicated plan):
- 扩展和定价:在预配的 App Service 实例上运行,采用手动或自动扩展规则。无论使用情况如何,您都需要为底层的 App Service 计划付费。
- 执行限制:平台对后台执行没有施加超时限制。当您已有空闲的 App Service 容量或需要一致的性能时,此计划是理想选择。
- 冷启动缓解:启用“始终开启 (Always On)”以保持应用加载。不会缩减到零;实例保持“热”状态。
对于成本优化的零星工作负载,选择消耗计划;对于低延迟和 VNET 需求,选择高级计划;当需要与现有 App Service 容量整合或需要完全控制时,选择专用计划。为实现超低延迟,采用带预热实例的高级计划或启用“始终开启”的专用计划可减少冷启动。通过精简依赖项、使用 run-from-package 以及延迟初始化客户端,可以进一步最大限度地减少冷启动的影响。
触发器与绑定
函数由触发器激活,并通过绑定与数据交互。触发器定义了函数如何以及何时运行。绑定以声明方式连接到外部服务以进行输入/输出,无需编写命令式的 SDK 代码。
常见触发器:
- HTTP 触发器:为 REST 风格的 API 或 Webhook 暴露端点。授权级别包括 Anonymous、Function 和 Admin,通过密钥或平台身份验证强制执行。对于长时间运行的任务,需考虑幂等性和超时;必要时将其卸载到队列或 Durable Functions。
- 计时器触发器:基于 CRON 的计划在每个应用(每个计时器)的单个实例上运行。使用带时区配置的 NCRONTAB 表达式。非常适合维护、轮询和清理作业。
- Azure Storage Queue 触发器:响应队列中的消息。支持毒消息处理,在出队次数达到阈值后,消息会进入 -poison 队列。通过 host.json 配置批处理大小、可见性超时和并发性。
- Azure Blob Storage 触发器:通过轮询和 Event Grid 通知的组合来响应 Blob 创建/更新事件。使用路径模式来限定容器和前缀的范围。理解大型 Blob 上传的最终一致性和重试行为。
- Azure Event Hubs 触发器:消费带有检查点功能的高吞吐量事件流。配置分区并发数、批处理大小和预取以提高吞吐量。适用于遥测和流处理,并能保持每个分区内的顺序。
- Azure Service Bus 触发器:支持队列或主题订阅。配置 maxConcurrentCalls、预取和自动完成行为。死信队列捕获超过投递尝试次数的消息,以供后续检查。
- Azure Cosmos DB 触发器:侦听变更源(change feed)中的插入和更新。随物理分区数量扩展;确保预配足够的 RU。使用租约集合(leases collection)来协调跨实例的横向扩展。
绑定:
- 输入绑定:向函数提供数据,例如 Blob 内容、表实体、Cosmos DB 文档或队列消息元数据。在 .NET 中,通过特性(例如,[BlobInput])或 function.json 定义绑定;在其他语言中,配置是声明式的。
- 输出绑定:无需 SDK 即可写入数据,例如将消息入队、创建 Blob、发送到 Event Hub/Service Bus 或写入 Cosmos DB。函数可以有多个输出绑定,或从函数签名返回单个输出。
- 绑定表达式:使用占位符(例如,{queueTrigger}、{rand-guid})和基于环境的应用设置来参数化连接详细信息和路径。连接属性引用应用程序设置名称,从而实现密钥轮换和机密管理。在支持的情况下,优先使用托管标识进行基于身份的连接,以避免嵌入机密。
- 并发与批处理:在 host.json 中按扩展(queues、serviceBus、eventHub)控制并发和批处理大小,以调整吞吐量和内存使用。验证毒消息/死信处理,确保故障能够浮现。
设计触发器和绑定时应考虑幂等性、反压和故障隔离。对于提供至少一次投递(at-least-once delivery)的源(如队列、Event Hubs、Service Bus),编写的函数应具有幂等性并能应对重试。
Durable Functions:可靠的业务流程编排模式
Durable Functions 通过使用持久任务框架(durable task framework),为 Azure Functions 扩展了有状态、可靠的业务流程编排能力,适用于长时间运行的工作流。
函数类型:
- Orchestrator 函数(编排器函数):在代码中使用确定性结构来描述工作流逻辑。编排器在收到事件时会重放状态,并且必须避免使用非确定性 API(如 DateTime.Now、随机数、网络调用),除非有适当的辅助工具。使用 Durable orchestration client API 来启动、查询和管理实例。
- Activity 函数(活动函数):执行离散的工作单元,例如调用外部 API、执行 CPU 密集型操作或 IO 任务。活动函数可重试且可独立扩展。
- Entity 函数(实体函数):提供具有少量、一致状态和操作的持久、可寻址实体(例如计数器、设备状态)。实体以单线程一致性处理序列化的操作。
模式:
- 函数链:按预定顺序(A → B → C)串联活动,并将结果传递给下一个活动。适用于有依赖关系的管道。
- 扇出/扇入:并行启动多个活动并聚合结果。编排器使用类似 Task.WhenAll 的语义进行协调。此模式用于并行处理独立任务。
- 人工交互(外部事件):使用 WaitForExternalEvent 等待外部输入(例如审批),可设置超时和升级策略。与持久计时器结合使用,可实现 SLA 和补偿逻辑。
- 异步 HTTP API:启动业务流程编排并返回
202 Accepted及状态/查询 URL。客户端轮询由 Durable client 绑定暴露的状态端点,以获取最终结果或状态。 - 监视器:按计划运行的周期性检查点,例如,使用持久计时器轮询一个端点直到满足某个条件,以避免占用计算资源。
- 聚合器/实体:使用实体函数将小状态与逻辑存储在一起,用于细粒度的协调,而无需完整的工作流。
Durable Functions 保证活动函数的至少一次执行(at-least-once execution)和编排器状态的恰好一次推进(exactly-once progression)。它们将状态持久化到存储中(默认为 Azure Storage);请确保存储帐户满足吞吐量和可靠性需求。对暂时性故障使用自定义重试策略,并为外部交互引发事件。对于非常长的流程,借助内置的持久性,Durable 业务流程编排可以运行数天到数月。
配置、部署与可观测性
函数应用的配置是分层的,并且能够感知环境。
- host.json:控制运行时和扩展的行为。可配置日志记录(采样、日志级别)、functionTimeout、扩展设置(批处理大小、并发度、预提取)以及 JSON 架构版本。请将 host.json 保留在源代码管理中。
- local.settings.json:本地开发设置,包括连接字符串和应用设置。此文件不会部署到 Azure。请妥善处理机密;将其从公共仓库中排除,并在本地开发中使用用户机密或环境变量注入。
- 应用程序设置:存储在函数应用(App Service)的配置中。关键设置包括 AzureWebJobsStorage(供触发器、日志和检查点使用的存储帐户)、特定于扩展的连接字符串以及任何自定义配置。将机密标记为槽设置以避免在交换时泄露。使用 Key Vault 引用和托管标识,以避免以纯文本形式存储机密。
部署选项:
- Zip 部署(Zip Deploy):将您构建产物的 ZIP 文件上传到应用。对于 CI/CD 而言,此方法快速且简单。可使用
undefined
或 zipdeploy API。它会将文件写入内容目录。
- 从包运行(Run-From-Package):将 WEBSITE_RUN_FROM_PACKAGE 设置为一个包 URL(或设为 1 以使用最新版本)。运行时会以只读方式挂载该包,从而改善冷启动并消除部署期间的文件锁定问题。将包存储在 Blob Storage 中,并使用 SAS URL 以实现可复现的回滚。
- 部署槽(Deployment slots):暂存槽和生产槽可通过预热实现零停机交换。高级(Premium)和专用(Dedicated)计划支持部署槽。为机密和终结点配置槽特定设置(槽设置标志),以防止跨环境泄漏。在流量转移前,使用交换前预热来验证扩展和绑定。
使用 Application Insights 进行监视:
- 调用日志:每次函数调用都会发出结构化遥测数据,包括请求(Requests)、跟踪(Traces)、异常(Exceptions)和依赖项(Dependencies)。使用 ILogger(或等效工具)进行结构化日志记录。操作 ID 和相关性 ID 将跨服务的活动和依赖项关联起来。
- 实时指标(Live Metrics):无需采样即可实时查看吞吐量、故障和延迟。有助于观察部署、扩缩和热路径。按函数名称筛选以隔离问题。
- 故障和可靠性:检查异常(Exceptions)、失败的请求(Requests)和依赖项故障。针对故障率、FunctionExecutionCount 异常或死信队列/中毒队列增长配置警报。对于 Storage Queue 触发器,监视 -poison 队列;对于 Service Bus/Event Hubs,监视死信和检查点健康状况。调整 host.json 中的重试策略和退避机制,以减少瞬时错误的影响。
- 分布式跟踪:启用 W3C 跟踪标头,以通过 HTTP 和消息传递传播相关性。对于 Durable Functions,该框架会链接业务流程和活动的遥测数据,有助于进行端到端诊断。调整采样以平衡成本和保真度。
通过部署自动化(GitHub Actions/Azure Pipelines)、HTTP 终结点的健康探测以及感知自动缩放的调优来运维函数。保持包的精简,将客户端(例如 HttpClient、Service Bus 客户端)缓存为静态单例,并在启动时验证绑定连接设置是否能成功解析,以防止运行时故障。
实际问题场景
Contoso 零售公司推出了一个促销服务,当顾客将商品添加到购物车时,该服务会实时应用折扣。后端必须以低延迟响应高变化的流量,调用第三方定价 API,并更新 Cosmos DB 中的购物车文档。运维团队要求实现零停机部署和对故障的深度可见性。
- 选择托管计划并构建应用结构
- 使用 Azure Functions 高级计划,配备两个预热实例并集成 VNET。高级计划消除了对延迟敏感的购物车交互的冷启动,并通过 VNET 中的 NAT 或防火墙保护到第三方 API 的出站流量安全。
- 创建一个函数应用,其中包含一个用于购物车终结点的 HTTP 触发函数,以及一个 Durable Functions 业务流程协调程序,用于协调折扣获取和购物车更新。
- 实现 Durable 业务流程以确保可靠性和并行性
- 业务流程协调程序函数:链接多个步骤,以验证输入,然后通过活动函数扇出(fan out)以并行方式为每个购物车行项目获取折扣,最后扇入(fan in)以聚合最优价格。Durable 业务流程确保了确定性的控制流和对重启的弹性。
- 活动函数:一个活动函数使用重试策略调用第三方 API;另一个通过输出绑定更新 Cosmos DB 中的购物车。活动函数封装了外部 IO,并且可以独立重试,而无需复制业务流程协调程序的逻辑。
- 配置触发器和绑定以简化操作
- 使用带 Function 身份验证的 HTTP 触发器,以接受来自 Web 前端的签名请求。对于长时间运行的购物车,返回 202 和一个状态 URL;对于快速路径,返回 200。
- 在活动函数上使用 Cosmos DB 输出绑定来更新或插入(upsert)购物车文档。绑定表达式使用来自 HTTP 负载的 cartId 来定位正确的分区键。
- 为 Cosmos DB 和 Key Vault 引用使用托管标识和基于标识的连接,从而从应用设置中移除机密。
- 优化配置和部署
- host.json 将 functionTimeout 设置为无限制(高级计划),并配置了对服务网格友好的 HTTP 超时。日志级别在生产环境中调整为 Information,采样率设置为 20% 以控制成本。
- 使用“从包运行”(run-from-package),包存储在带版本控制的 Blob 容器中。通过 CI 使用 az functionapp deployment 进行部署,并通过暂存槽交换到生产槽,以实现零停机发布。
- 将连接字符串和 API 终结点标记为槽设置,以避免跨环境泄漏。
- 监视和运维
- 启用 Application Insights 和实时指标(Live Metrics),以在发布期间观察吞吐量和延迟。
- 针对 HTTP 5xx 错误、到定价 API 的依赖项故障率以及 Durable 函数失败的业务流程数量增加配置警报。
- 使用分布式跟踪将 HTTP 请求与 Durable 业务流程和活动依赖项关联起来,从而加快对间歇性第三方问题的根本原因分析。
为何选择这些方案:
- 高级计划配备预热实例,可确保始终如一的低延迟,并支持 VNET 集成以实现安全的出口流量。
- Durable Functions 为外部 API 调用提供了可靠的链式调用和扇出/扇入模式,并带有自动的状态和重试管理。
- 绑定减少了样板代码,并对 Cosmos DB 强制执行了一致的、声明式的数据访问。
- “从包运行”和部署槽可实现可重复的原子化部署,没有文件锁定问题或停机时间。
- Application Insights 提供了与运维 SLA 一致的实时可观测性、关联和警报功能。
← Azure 应用服务与 Web 应用 · 所有领域 · Azure 存储与 Blob 存储 →
练习这些题目 → · 在 ExamRoll.io 上限时练习 →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
通过考试 →