

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

# Lambda 受管執行個體的 .NET 執行時間
<a name="lambda-managed-instances-dotnet-runtime"></a>

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

## 並行組態
<a name="lambda-managed-instances-dotnet-concurrency-config"></a>

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

## 為多並行建置函數
<a name="lambda-managed-instances-dotnet-building"></a>

使用 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 目錄
<a name="lambda-managed-instances-dotnet-shared-tmp"></a>

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

## 日誌
<a name="lambda-managed-instances-dotnet-logging"></a>

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

## 請求內容
<a name="lambda-managed-instances-dotnet-request-context"></a>

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

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

使用 `ILambdaContext.RemainingTime` 偵測逾時。如需詳細資訊，請參閱[錯誤處理和復原](lambda-managed-instances-execution-environment.md#lambda-managed-instances-error-handling)。

## 初始化和關閉
<a name="lambda-managed-instances-dotnet-init-shutdown"></a>

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

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

## 相依性版本
<a name="lambda-managed-instances-dotnet-dependencies"></a>

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)
<a name="lambda-managed-instances-dotnet-powertools"></a>

[Powertools for AWS Lambda (.NET)](https://docs.aws.amazon.com/powertools/dotnet/) 和 [AWS Distro for OpenTelemetry - Instrumentation for DotNet](https://github.com/aws-observability/aws-otel-dotnet-instrumentation) 目前不支援 Lambda 受管執行個體。

## 後續步驟
<a name="lambda-managed-instances-dotnet-next-steps"></a>
+ 檢閱 [Lambda 受管執行個體的 Java 執行時間](lambda-managed-instances-java-runtime.md)
+ 檢閱 [Lambda 受管執行個體的 Node.js 執行時間](lambda-managed-instances-nodejs-runtime.md)
+ 檢閱 [Lambda 受管執行個體的 Python 執行時間](lambda-managed-instances-python-runtime.md)
+ 了解[擴展 Lambda 受管執行個體](lambda-managed-instances-scaling.md)