AWS Lambda 是现代云架构中最受欢迎的服务之一,因其能够在完全托管的无服务器环境中运行代码而广受认可。然而,尽管 Lambda 广受欢迎,许多开发者和架构师对它的底层运作机制却知之甚少,常常将其视为“编写能够在云端神奇运行的代码”的简单方法。
本文将探讨 AWS Lambda 背后的架构,详细解析它如何以真正的无服务器方式管理实例、配置资源并处理执行。最终,您将全面了解 Lambda 的内部工作原理,从而能够进行更明智的优化,并在应用程序中更有效地利用它。
Lambda 中的关键概念
在讨论无服务器和云计算时,务必记住服务器确实在后台运行。但是,这些服务器完全由云提供商管理——这意味着它们负责配置、扩展、安全和隔离。这使得开发者可以专注于他们的应用程序,而无需承担管理基础设施的开销。
让我们深入了解 Lambda 架构中您需要了解的一些基本概念。
Lambda 运行时
AWS Lambda 通过使用运行时支持多种编程语言。运行时提供特定于语言的环境,用于管理 Lambda 和函数代码之间调用事件、上下文信息和响应的传递。您可以从 AWS 提供的运行时中进行选择,或者,如果您的应用程序需要不同的环境,您可以灵活地创建自定义运行时。
每个受支持的编程语言的主要版本都带有唯一的运行时标识符,例如 nodejs20.x 或 python3.13,允许您选择最适合您应用程序需求的版本。
工作主机和 MicroVM
Lambda 使用工作主机(EC2 Spot 实例)运行,这些主机管理由 Firecracker(我们接下来会讨论 Firecracker)构建的众多 microVM(承载执行环境的虚拟机)。每个 microVM 都专用于单个函数调用,从而确保执行环境的隔离和安全。此外,该架构的设计使得多个工作器主机可以并发处理同一 Lambda 函数的调用。这种设置不仅提供了高可用性和强大的负载均衡,还增强了服务在不同可用区之间的可扩展性和可靠性;
Worker 的最大租约期限为 14 小时。当 Worker 达到最大租约期限时,将不再路由任何调用,MicroVM 将被正常终止,底层 Worker 实例也将终止。Lambda 会持续监控其队列生命周期内的活动并发出警报。
Firecracker
Firecracker 是驱动所有 Lambda 函数的引擎。它是 Amazon 开发的虚拟化技术,使用 Rust 编写。
Firecracker 是 Lambda 架构中的一个重要组件。它支持为每个函数调用创建轻量级、安全的 microVM。此机制确保根据 Lambda 函数的需求高效地分配和扩展资源;
Firecracker 在 EC2 Spot 实例内管理 MicroVM,而 Lambda 服务则管理所有工作线程
Lambda 调用
AWS Lambda 提供多种调用方法以满足各种应用需求,其架构旨在高效支持每种方法。目前为止,我们讨论的关键概念根据所使用的调用方法以不同的方式运作,并以不同的方式进行交互,从而优化性能和可扩展性。
在深入了解 Lambda 环境中如何处理每个调用之前,让我们先回顾一下可用的调用类型。
- 同步调用:通常用于 API 等交互式工作负载。例如,API 网关触发 Lambda 函数,该函数随后查询数据库并直接响应。此方法即时响应,适用于实时数据处理。
- 异步调用:用于处理上传到 S3 的数据等场景。事件触发由 AWS Lambda 管理的内部队列,然后该队列异步处理该函数。此方法非常适合不需要立即响应触发事件的工作负载。
- 事件源映射:对于 Kinesis 或 DynamoDB Streams 等流数据服务尤其有用。Lambda 会轮询这些源,并根据传入的数据调用相应的函数。此方法能够高效地进行批处理,对于处理连续数据流的应用程序而言至关重要。
Lambda 通用架构
Lambda 函数的调用方式多种多样,虽然调用方法会根据触发它的服务而有所不同,但其核心内部架构保持一致。然而,Lambda 与同步 (Sync) 和异步 (Async) 调用的交互方式有所不同。
每个 Lambda 调用的核心都是前端服务,它是 Lambda 函数的入口点。当 Lambda 函数被调用时,前端服务会管理请求并将其定向到相应的数据平面服务,从而启动执行流程。
Lambda 函数的调用主要有两种方式:同步或异步。
- 同步调用:在同步调用中,前端服务会将请求直接路由到 MicroVM 进行立即处理。
- 异步调用:对于异步调用,前端服务会将请求放入 Lambda 内部的队列中。这种内部排队机制可以有效地将排队事件分发到可用的 MicroVM 上。队列通过确保事件的顺畅分发,使