

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# .NET runtime untuk Instans Terkelola Lambda
<a name="lambda-managed-instances-dotnet-runtime"></a>

Untuk runtime.NET, Instans Terkelola Lambda menggunakan satu proses.NET per lingkungan eksekusi. Beberapa permintaan bersamaan diproses menggunakan .NET Tasks.

## Konfigurasi konkurensi
<a name="lambda-managed-instances-dotnet-concurrency-config"></a>

Jumlah maksimum permintaan bersamaan yang dikirim Lambda ke setiap lingkungan eksekusi dikendalikan oleh pengaturan `PerExecutionEnvironmentMaxConcurrency` dalam konfigurasi fungsi. Ini adalah pengaturan opsional, dan nilai default bervariasi tergantung pada runtime. Untuk runtime.NET, defaultnya adalah 32 permintaan bersamaan per vCPU, atau Anda dapat mengonfigurasi nilai Anda sendiri. Lambda secara otomatis menyesuaikan jumlah permintaan bersamaan hingga maksimum yang dikonfigurasi berdasarkan kapasitas setiap lingkungan eksekusi untuk menyerap permintaan tersebut.

## Membangun fungsi untuk multi-konkurensi
<a name="lambda-managed-instances-dotnet-building"></a>

Anda harus menerapkan praktik keamanan konkurensi yang sama saat menggunakan Instans Terkelola Lambda seperti yang Anda lakukan di lingkungan multi-konkuren lainnya. Karena objek handler dibagikan di semua Tugas, status apa pun yang bisa berubah harus aman untuk utas. Ini termasuk koleksi, koneksi database, dan objek statis apa pun yang dimodifikasi selama pemrosesan permintaan.

AWS Klien SDK aman untuk utas dan tidak memerlukan penanganan khusus.

**Contoh: Kolam koneksi database**

Kode berikut menggunakan objek koneksi database statis yang dibagi antara permintaan bersamaan. `SqlConnection`Objeknya tidak aman untuk utas.

```
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();

        ...
    }
}
```

Untuk mengatasinya, gunakan koneksi terpisah untuk setiap permintaan, yang diambil dari kumpulan koneksi. Penyedia ADO.NET suka `Microsoft.Data.SqlClient` secara otomatis mendukung penyatuan koneksi saat objek koneksi dibuka.

```
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();

        ...
    }
}
```

**Contoh: Koleksi**

Koleksi .NET standar tidak aman untuk utas:

```
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";
    }
}
```

Gunakan koleksi dari `System.Collections.Concurrent` namespace untuk keamanan konkurensi:

```
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";
    }
}
```

## Direktori bersama/tmp
<a name="lambda-managed-instances-dotnet-shared-tmp"></a>

`/tmp`Direktori dibagikan di semua permintaan bersamaan di lingkungan eksekusi. Menulis bersamaan ke file yang sama dapat menyebabkan kerusakan data, misalnya jika permintaan lain menimpa file. Untuk mengatasinya, terapkan penguncian file untuk file bersama atau gunakan nama file unik per permintaan untuk menghindari konflik. Ingatlah untuk membersihkan file yang tidak dibutuhkan untuk menghindari kehabisan ruang yang tersedia.

## Pencatatan log
<a name="lambda-managed-instances-dotnet-logging"></a>

Log interleaving (entri log dari permintaan berbeda yang disisipkan dalam log) adalah normal dalam sistem multi-konkuren. [Fungsi yang menggunakan Instans Terkelola Lambda selalu menggunakan format log JSON terstruktur yang diperkenalkan dengan kontrol logging lanjutan.](monitoring-logs.md#monitoring-cloudwatchlogs-advanced) Format ini mencakup`requestId`, memungkinkan entri log dikorelasikan dengan satu permintaan. Bila Anda menggunakan `context.Logger` objek untuk menghasilkan log, `requestId` secara otomatis disertakan dalam setiap entri log. Untuk informasi lebih lanjut, lihat[Menggunakan kontrol logging lanjutan Lambda dengan.NET](csharp-logging.md#csharp-logging-advanced).

## Konteks permintaan
<a name="lambda-managed-instances-dotnet-request-context"></a>

Gunakan `context.AwsRequestId` properti untuk mengakses ID permintaan untuk permintaan saat ini.

Gunakan `context.TraceId` properti untuk mengakses ID jejak X-Ray. Ini memberikan akses aman konkurensi ke ID jejak untuk permintaan saat ini. Lambda tidak mendukung variabel `_X_AMZN_TRACE_ID` lingkungan dengan Instans Terkelola Lambda. ID jejak X-Ray disebarkan secara otomatis saat menggunakan AWS SDK.

Gunakan `ILambdaContext.RemainingTime` untuk mendeteksi batas waktu. Untuk informasi selengkapnya, lihat [Penanganan dan pemulihan kesalahan](lambda-managed-instances-execution-environment.md#lambda-managed-instances-error-handling).

## Inisialisasi dan shutdown
<a name="lambda-managed-instances-dotnet-init-shutdown"></a>

Inisialisasi fungsi terjadi sekali per lingkungan eksekusi. Objek yang dibuat selama inisialisasi dibagikan di seluruh permintaan.

Untuk fungsi Lambda dengan ekstensi, lingkungan eksekusi memancarkan sinyal SIGTERM saat dimatikan. Sinyal ini digunakan oleh ekstensi untuk memicu tugas pembersihan, seperti pembilasan buffer. Anda dapat berlangganan peristiwa SIGTERM untuk memicu tugas pembersihan fungsi, seperti menutup koneksi database. Untuk mempelajari lebih lanjut tentang siklus hidup lingkungan eksekusi, lihat. [Memahami siklus hidup lingkungan pelaksanaan Lambda](lambda-runtime-environment.md)

## Versi ketergantungan
<a name="lambda-managed-instances-dotnet-dependencies"></a>

Instans Terkelola Lambda memerlukan versi paket minimum berikut:
+ Amazon.Lambda.Core: versi 2.7.1 atau yang lebih baru
+ Amazon.Lambda. RuntimeSupport: versi 1.14.1 atau yang lebih baru
+ OpenTelemetry.Instrumentasi. AWSLambda: versi 1.14.0 atau yang lebih baru
+ AWSXRayRecorder.Core: versi 2.16.0 atau yang lebih baru
+ AWSSDK.Core: versi 4.0.0.32 atau yang lebih baru

## Powertools para AWS Lambda (.NET)
<a name="lambda-managed-instances-dotnet-powertools"></a>

[Powertools untuk AWS Lambda (.NET](https://docs.aws.amazon.com/powertools/dotnet/)) [AWS dan Distro OpenTelemetry untuk - Instrumentasi DotNet untuk](https://github.com/aws-observability/aws-otel-dotnet-instrumentation) saat ini tidak mendukung Instans Terkelola Lambda.

## Langkah selanjutnya
<a name="lambda-managed-instances-dotnet-next-steps"></a>
+ Tinjau [runtime Java untuk Instans Terkelola Lambda](lambda-managed-instances-java-runtime.md)
+ Tinjau [runtime Node.js untuk Instans Terkelola Lambda](lambda-managed-instances-nodejs-runtime.md)
+ Tinjau [runtime Python untuk Instans Terkelola Lambda](lambda-managed-instances-python-runtime.md)
+ Pelajari tentang [penskalaan Instans Terkelola Lambda](lambda-managed-instances-scaling.md)