.NET runtime untuk Instans Terkelola Lambda - AWS Lambda

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

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

Konfigurasi konkurensi

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

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. SqlConnectionObjeknya 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

/tmpDirektori 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.

Logging

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. Format ini mencakuprequestId, 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.

Konteks permintaan

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.

Inisialisasi dan shutdown

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 eksekusi Lambda.

Versi ketergantungan

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)

Powertools untuk AWS Lambda (.NET) AWS dan Distro OpenTelemetry untuk - Instrumentasi DotNet untuk saat ini tidak mendukung Instans Terkelola Lambda.

Langkah selanjutnya