Lambda 受管執行個體的 .NET 執行時間 - AWS Lambda

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

Lambda 受管執行個體的 .NET 執行時間

對於 .NET 執行時間,Lambda 受管執行個體在每個執行環境中使用單一 .NET 程序。使用 .NET 任務處理多個並行請求。

並行組態

Lambda 傳送至每個執行環境的並行請求數目上限是由函數組態中的 PerExecutionEnvironmentMaxConcurrency設定所控制。這是選用設定,預設值會根據執行時間而有所不同。對於 .NET 執行時間,預設值為每個 vCPU 32 個並行請求,或者您可以設定自己的值。Lambda 會根據每個執行環境的容量,自動調整並行請求的數量,直到設定的最大值為止,以吸收這些請求。

為多並行建置函數

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

AWS SDK 用戶端是安全的執行緒,不需要特殊處理。

範例:資料庫連線集區

下列程式碼使用在並行請求之間共用的靜態資料庫連線物件。SqlConnection 物件執行緒不安全。

public class DBQueryHandler { // Single connection shared across threads - NOT SAFE private SqlConnection connection; public DBQueryHandler() { connection = new SqlConnection("your-connection-string-here"); connection.Open(); } public string Handle(object input, ILambdaContext context) { using var cmd = connection.CreateCommand(); cmd.CommandText = "SELECT ..."; // your query using var reader = cmd.ExecuteReader(); ... } }

若要解決此問題,請針對從連線集區提取的每個請求使用個別連線。ADO.NET 等供應商會在連線物件開啟時Microsoft.Data.SqlClient自動支援連線集區。

public class DBQueryHandler { public DBQueryHandler() { } public string Handle(object input, ILambdaContext context) { using var connection = new SqlConnection("your-connection-string-here"); connection.Open(); using var cmd = connection.CreateCommand(); cmd.CommandText = "SELECT ..."; // your query using var reader = cmd.ExecuteReader(); ... } }

範例:集合

標準 .NET 集合不安全執行緒:

public class Handler { private static List<string> items = new List<string>(); private static Dictionary<string, object> cache = new Dictionary<string, object>(); public string FunctionHandler(object input, ILambdaContext context) { items.Add(context.AwsRequestId); cache["key"] = input; return "Success"; } }

使用 System.Collections.Concurrent命名空間的集合以確保並行安全性:

public class Handler { private static ConcurrentBag<string> items = new ConcurrentBag<string>(); private static ConcurrentDictionary<string, object> cache = new ConcurrentDictionary<string, object>(); public string FunctionHandler(object input, ILambdaContext context) { items.Add(context.AwsRequestId); cache["key"] = input; return "Success"; } }

共用 /tmp 目錄

/tmp 目錄會在執行環境中所有並行請求之間共用。同時寫入至相同檔案可能會導致資料損毀,例如,如果另一個請求覆寫檔案。若要解決此問題,請實作共用檔案的檔案鎖定,或針對每個請求使用唯一的檔案名稱以避免衝突。請記得清除不需要的檔案,以避免耗盡可用空間。

日誌

日誌交錯 (來自在日誌中交錯之不同請求的日誌項目) 在多並行系統中是正常的。使用 Lambda 受管執行個體的函數一律使用進階記錄控制引進的結構化 JSON 日誌格式。此格式包含 requestId,允許日誌項目與單一請求相關聯。當您使用 context.Logger 物件產生日誌時, requestId 會自動包含在每個日誌項目中。如需詳細資訊,請參閱搭配 .NET 使用 Lambda 進階記錄控制

請求內容

使用 context.AwsRequestId 屬性來存取目前請求的請求 ID。

使用 context.TraceId 屬性存取 X-Ray 追蹤 ID。這可讓您同時安全存取目前請求的追蹤 ID。Lambda 不支援具有 Lambda 受管執行個體_X_AMZN_TRACE_ID的環境變數。使用 AWS SDK 時,會自動傳播 X-Ray 追蹤 ID。

初始化和關閉

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

對於具有擴充功能的 Lambda 函數,執行環境會在關閉期間發出 SIGTERM 訊號。延伸項目使用此訊號來觸發清除任務,例如排清緩衝區。您可以訂閱 SIGTERM 事件來觸發函數清除任務,例如關閉資料庫連線。若要進一步了解執行環境生命週期,請參閱了解 Lambda 執行環境生命週期

相依性版本

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

  • Amazon.Lambda.Core:2.7.1 版或更新版本

  • Amazon.Lambda.RuntimeSupport:1.14.1 版或更新版本

  • OpenTelemetry.Instrumentation.AWSLambda:1.14.0 版或更新版本

  • AWSXRayRecorder.Core:2.16.0 版或更新版本

  • AWSSDK.Core:4.0.0.32 版或更新版本

適用於 AWS Lambda 的 Powertools (.NET)

Powertools for AWS Lambda (.NET)AWS Distro for OpenTelemetry - Instrumentation for DotNet 目前不支援 Lambda 受管執行個體。

後續步驟