Rust 支援 Lambda 受管執行個體 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Rust 支援 Lambda 受管執行個體

並行組態

Lambda 傳送至每個執行環境的並行請求數目上限是由函數組態中的 PerExecutionEnvironmentMaxConcurrency設定所控制。這是選用設定,而 Rust 的預設值為每個 vCPU 8 個並行請求,或者您可以設定自己的值。此值會決定執行時間產生的 Tokio 任務數量,並在執行環境的生命週期內為靜態。每個工作者一次只處理一個傳輸中請求,每個工作者都沒有多工。Lambda 會根據每個執行環境的容量,自動調整並行請求的數量,直到設定的最大值為止,以吸收這些請求。

為多並行建置函數

使用 Lambda 受管執行個體時,您應該套用與任何其他多執行緒環境中相同的執行緒安全實務。由於處理常式物件會跨所有工作者執行緒共用,因此任何變動狀態都必須是執行緒安全。這包括集合、資料庫連線,以及在請求處理期間修改的任何靜態物件。

若要啟用並行請求處理,請將concurrency-tokio功能旗標新增至 Cargo.toml 檔案。

[dependencies] lambda_runtime = { version = "1", features = ["concurrency-tokio"] }

lambda_runtime::run_concurrent(…) 進入點必須在 Tokio 執行時間內從 呼叫,通常由主要函數上的 #[tokio::main] 屬性提供。您的處理常式關閉必須實作 Clone + Send。這可讓架構安全地跨多個非同步任務共用您的處理常式。如果不符合這些邊界,您的程式碼將無法編譯。

當您需要跨調用 (資料庫集區、組態結構) 的共用狀態時,請將它包裝在 中,Arc並將 Arc 複製到每個調用中。

所有適用於 Rust 的 AWS SDK 用戶端都具有並行安全性,不需要特殊處理。

範例: AWS SDK 用戶端

下列範例使用 S3 用戶端在每次叫用時上傳物件。在沒有 的情況下,用戶端會直接複製到關閉中Arc

let config = aws_config::load_defaults(BehaviorVersion::latest()).await; let s3_client = aws_sdk_s3::Client::new(&config); run_concurrent(service_fn(move |event: LambdaEvent<Request>| { let s3_client = s3_client.clone(); // cheap clone, no Arc needed async move { s3_client.put_object() .bucket(&event.payload.bucket) .key(&event.payload.key) .body(event.payload.body.into_bytes().into()) .send() .await?; Ok(Response { message: "uploaded".into() }) } })) .await

範例:資料庫連線集區

當您的處理常式需要存取共用狀態,例如用戶端和組態時,請將它包裝在 中,Arc並將 Arc 複製到每個調用中:

#[derive(Debug)] struct AppState { dynamodb_client: DynamoDbClient, table_name: String, cache_ttl: Duration, } let config = aws_config::load_defaults(BehaviorVersion::latest()).await; let state = Arc::new(AppState { dynamodb_client: DynamoDbClient::new(&config), table_name: std::env::var("TABLE_NAME").expect("TABLE_NAME must be set"), cache_ttl: Duration::from_secs(300), }); run_concurrent(service_fn(move |event: LambdaEvent<Request>| { let state = state.clone(); async move { handle(event, state).await } })) .await

共用 /tmp 目錄

/tmp 目錄會在相同執行環境中的所有並行調用之間共用。每次叫用使用唯一的檔案名稱 (例如包含請求 ID) 或實作明確檔案鎖定以避免資料損毀。

日誌

日誌交錯 (來自在日誌中交錯之不同請求的日誌項目) 在多並行系統中是正常的。使用 Lambda 受管執行個體的函數透過 Lambda 的進階記錄控制支援結構化 JSON 日誌格式。此格式包含 requestId,允許日誌項目與單一請求相關聯。如需詳細資訊,請參閱 實作帶有追蹤套件的進階日誌記錄

請求內容

Context 物件會直接傳遞至每個處理常式調用。使用 event.context.request_id 存取目前請求的請求 ID。

使用 event.context.xray_trace_id 存取 X-Ray 追蹤 ID。Lambda 不支援具有 Lambda 受管執行個體_X_AMZN_TRACE_ID的環境變數。使用適用於 Rust 的 AWS SDK 時,會自動傳播 X-Ray 追蹤 ID。

使用 event.context.deadline 來偵測逾時 — 它包含以毫秒為單位的調用截止日期。

初始化和關閉

每個執行環境會發生一次函數初始化。在初始化期間建立的物件會跨請求共用。

對於具有擴充功能的 Lambda 函數,執行環境會在關閉期間發出 SIGTERM 訊號。延伸項目使用此訊號來觸發清除任務,例如排清緩衝區。 lambda_runtime提供協助程式,以簡化設定正常的關閉訊號處理spawn_graceful_shutdown_handler()。若要詳細了解執行環境生命週期,請參閱 了解 Lambda 執行環境生命週期

相依性版本

Lambda 受管執行個體需要下列最低套件版本:

  • lambda_runtime:1.1.1 版或更新版本,並啟用 concurrency-tokio功能

  • 支援的 Rust 版本 (MSRV) 下限為 1.84.0。