云计算-Azure Functions :构建事件驱动的云原生应用报告
云计算导论
课程研究报告
Azure Functions :构建事件驱动的云原生应用
摘要:
Azure Functions 是一种无服务器解决方案,是由微软 Azure 平台提供的,可以使用户专注于业务逻辑,减少代码的编写,减少需要维护的基础结构并节省成本,不需要管理底层的基础设施。
在云计算的发展进程中,Serverless 架构实现重大突破,将基础设施提升到了新的高度。Azure Functions作为Serverless的主要实现,推动了事件驱动架构在云原生应用上的深化。
关键字:Azure Functions、Serverless、云原生、事件驱动架构
1无服务器计算的基石:事件驱动与按需执行
Azure Functions 的核心理念之一就是事件驱动。在函数代码的执行中,不是持续运行等待请求的,而是由触发器触发特定事件,按需执行。
1.1事件驱动模型
该模型主要由触发器和绑定两部分组成。
触发器:
触发器是函数的入口,函数的启动方式由它决定。当触发器接收到特定事件发生的信息时,它就会自动激活并执行函数。
常见的触发器类型有HTTP触发器、Timer 触发器、Azure Blob Storage 触发器、Azure Queue Storage 触发器、Azure Service Bus 触发器、Azure Event Hubs 触发器、Azure Cosmos DB 触发器、Azure Cosmos DB 触发器等。每种触发器的内部都有自己一套监听机制,当事件发生的时候,触发器会打包相关数据信息作为输入,传递给函数。
绑定:
绑定的声明式方式将Azure 服务的数据连接到函数上去,这样能简化数据的输入输出。这样下来,用户就可以不需要编写复杂的SDK代码来实现想要的功能。
绑定分为三种内容:输入绑定、输出绑定、双向绑定。输入绑定是将从外部读取的直接传递给函数;输出绑定是将函数的处理结果写入外部数据源;双向绑定可以在一个绑定声明中同时进行读写操作。在Azure Functions在运行时,需要处理绑定的底层逻辑,要与目标建立连接,处理数据的输入绑定与输出绑定,并进行序列化与反序列化。
1.2多语言支持
Azure Functions 可以使用多种语言,比如 C#、Java、JavaScript、Python、PowerShell、Rust、Go等。
Azure Functions 提供了与多种流行开发工具的集成,比如 Visual Studio、Visual Studio Code、Maven、IntelliJ IDEA等。
1.3云计算关联
触发器与绑定体现了云计算中的的弹性、事件响应能力和云服务间的集成和自动化的能力,让云服务能够动态变化,按需分配资源,让数据在多个服务之间的流动变得简单、声明化和高效。
2运行时环境与执行模型
Azure Functions 的Azure Functions Host组件,负责处理函数的代码,触发器与绑定,监听事件源等。Host还可以处理日志记录、监控性能等。
2.1函数生命周期
当事件发生时,触发器传递事件数据,在消耗计划下且没有可用实例时,可能经历冷启动过程完成资源分配和运行时初始化;Host随后将内容传递给函数代码执行业务逻辑,输出绑定返回结果,同时记录执行日志和监控数据;完成后,闲置实例会根据计划类型被回收或保持预热状态。
2.2 Durable Functions:在无服务器中实现有状态工作流
Durable Functions是Azure Functions的一个扩展,它允许用户在无服务器环境中编写有状态的工作流,旨在克服传统的无状态限制。
2.3核心概念与模式
Orchestrator Functions定义了工作流中业务流程的逻辑顺序。
Activity Functions 是工作流中执行实际工作的基本单元,是无状态的,可以被编排函数调用多次。
Entity Functions 用于读取和更新小块的持久化状态,可以看作是具有唯一标识符的持久化对象或小型服务,实体函数通过操作修改其状态。
Client Functions 是与 Durable Functions 工作流交互的入口点,用于启动新的编排实例、查询现有编排的状态、向正在等待的编排发送事件或终止编排。
Durable Functions 支持多种常见的有状态应用模式,常见的有:Function Chaining、Fan-out/Fan-in、异步 HTTP API、Monitor、Human Interaction
状态管理与持久化:Durable Functions 的核心是 Durable Task Framework。该框架在后台使用 Azure Storage来持久化编排函数的状态、执行历史和消息。当编排函数 `await` 一个活动函数或定时器时,它实际上是将控制权交还给 Durable Task Framework,并将保存其当前状态到 Azure Storage。当等待的操作完成时,框架会重新激活编排函数,并从存储中恢复其状态,使其从上次中断的地方继续执行。
2.4云计算关联
Durable Functions 对Serverless架构的应用进行了扩展,对于简单的、无状态的事件处理,Serverless不再有局限性,而且能够胜任更复杂的、有状态的业务流程自动化。这使用户可以更充分地利用云计算的优势来构建复杂的分布式系统。
3托管与部署选项:适应不同云计算需求
Azure Functions 提供了多种托管计划和部署选项,以满足不同应用场景对性能、成本、可伸缩性和控制级别的需求。
3.1托管计划深度对比
主要的托管计划包括消耗计划、高级计划和专用计划(应用服务计划)。
Azure Functions 托管计划对比表
特性 | 消耗计划 | 高级计划 | 专用计划 |
核心机制 | 事件驱动动态伸缩,按执行付费 | 预热实例,高性能 | 预分配虚拟机资源 |
伸缩行为 | 从零到高并发,自动 | 可配置最小/最大实例,自动 | 手动或基于计划规则自动 |
冷启动 | 可能发生,对延迟敏感应用有影响 | 通过预热实例显著减少或消除 | 始终开启实例,无冷启动 |
计费模型 | 按执行次数、执行时间 (GB-秒)、内存 | 按预配置实例核心数/内存及时长、执行量 | 按 App Service 计划层级和时长 |
VNet 集成 | 有限(通过混合连接或专用终结点,较复杂) | 支持 | 支持 |
执行超时 | 默认5分钟,最长10分钟 | 默认30分钟,最长可配置为无限 (60分钟保证) | 默认30分钟,最长可配置为无限 (60分钟保证) |
适用场景 | 事件驱动突发负载、成本敏感、开发测试 | 低延迟、避免冷启动、VNet 连接、长时间运行 | 已有 App Service 投资、固定成本、稳定性能 |
3.2容器化部署
Azure Functions 支持将函数打包成 Docker 容器进行部署,这为开发者提供了更大的灵活性和控制力。
支持平台有:Azure Container Apps、Azure Kubernetes Service 、自托管 Kubernetes
此方法进行部署的优势有:完全控制运行时环境,与现有容器化工作流集成;拥有可移植性,可以在任何支持 Docker 的环境中运行。
Functions 工具支持:Azure Functions Core Tools 。
部署署策略与 DevOps 集成:
开发工具集成:Visual Studio 和 Visual Studio Code。
Azure Functions Core Tools:本地开发的核心命令行工具。
部署方法有:Zip Deploy,将函数应用打包成 zip 文件的部署方法;Run From Package, 类似于Zip Deploy,但是它是将函数代码直接从上传的包文件中运行的;Web Deploy,将项目发布到 Azure,通常是用于Visual Studio的方法;容器注册表,用于容器化部署,先将镜像推送到注册表,然后配置托管平台从中拉取镜像;外部包URL,函数代码包可以托管在外部URL,Functions 运行时会从中下载并运行。
CI/CD 集成有:Azure DevOps Pipelines,创建构建和发布管道并自动化完成从代码的提交到部署到 Azure Functions 的整个过程;GitHub Actions,在GitHub中定义工作流实现与代码紧密集成的自动化构建和部署;部署槽,用于高级计划和专用计划,允许部署新函数应用到一个预备环境进行测试和验证,然后实现与生产环境无缝切换。
3.3云计算关联
容器化部署展现了Serverless与容器化趋势的融合,Serverless的灵活性与容器的可控性和可移植性的结合让我们为构建现代云原生应用而得到了更多帮助与选择。
4 性能优化与最佳实践:构建高效可靠的云应用
4.1深入理解与优化冷启动
有多种策略可以缓解冷启动。第一,关于高级计划的预热实例 ,我们可以通过对预热实例进行配置,保证始终有实例准备好处理请求;第二,是进行消耗计划优化策略,可以需要选择适合的语言进行运行,可以对代码和依赖项进行最小化处理,也可以使用 "Run From Package"来保持函数实例活跃。第三,关于Durable Functions 预热,通过触发编排,调用一些关键的活动函数,来进行预热。
4.2安全性
身份验证与授权的方式有:Function Keys、集成 Azure Active Directory、输入验证。
密钥与机密管理方式有:使用 Azure Key Vault、通过 Managed Identity访问 Key Vault、避免在代码或配置文件中硬编码机密。
网络安全方面:使用VNet 集成和专用终结点、配置入站和出站 IP 限制。
最小权限原则:为函数应用及其托管标识分配执行其任务所需的最小权限。
4.3成本优化策略
要实现成本的优化需要拥有良好的策略。第一,要拥有合适的托管计划,根据工作负载,选择最合适的计划,比如消化计划、高级计划、专用计划;第二,可以通过监控执行和资源的消耗,使用Azure Monitor 和 Application Insights紧密追踪函数的执行过程与状态,识别高成本的部分进行优化;第三,通过减少不必要的函数调用等方法,对代码进行优化,减少函数执行时间;第四,合理分配内存空间,配置的空间不要过大过小。
4.4可观测性:监控、日志与追踪
拥有良好的可观测性对我们理解函数、发现问题、优化性能、保证可靠性有着极大的优势。在Azure Functions中,我们使用其中的Application Insights来进行监控方面的处理。Application Insights能够主动收集各项数据,包括请求、异常、指标、日志等。在分布式追踪中,Application Insights可以将一个请求流经多个函数或服务的操作联结起来,为我们提供追踪视图。还有Live Metrics Stream也能够提供几乎实时的函数执行视图。
在结构化日志中,使用 `ILogger` 接口来编写日志。
参考文献
- Microsoft Azure官方文档:《Azure Functions 概述》
- Microsoft Azure官方文档:《Azure Functions的存储注意事项》
- Microsoft Azure官方文档:《Azure Functions与Cosmos DB集成示例》
- Microsoft Azure官方文档:《Azure Functions最佳做法》
- Microsoft Azure官方文档:《Azure Functions安全概念》
- GitHub:《Azure集成服务应用模板示例》
- 博客文章:《优化Azure Functions冷启动》