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 上。隊列通過確保事件的順暢分發,使