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. ADO.NET penyedia seperti Microsoft.Data.SqlClient secara otomatis mendukung penyatuan koneksi ketika 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.
Pencatatan log
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, lihatMenggunakan 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 X-Ray jejak. 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 X-Ray jejak disebarkan secara otomatis saat menggunakan AWS SDK.
Gunakan ILambdaContext.RemainingTime untuk mendeteksi batas waktu. Untuk informasi selengkapnya, lihat Penanganan dan pemulihan kesalahan.
Contoh: Penanganan batas waktu
Periksa sisa waktu sebelum setiap unit kerja dan hentikan pemrosesan sebelum batas waktu habis. Konfigurasikan buffer berdasarkan durasi yang diharapkan dari potongan pekerjaan Anda berikutnya.
private static readonly TimeSpan Buffer = TimeSpan.FromMilliseconds(2000); public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { var items = JsonSerializer.Deserialize<List<string>>(request.Body); foreach (var item in items) { if (context.RemainingTime < Buffer) return new APIGatewayProxyResponse { StatusCode = 206, Body = "Timeout approaching, stopping early" }; ProcessItem(item); } return new APIGatewayProxyResponse { StatusCode = 200, Body = "Done" }; }
Contoh: Menyebarkan tenggat waktu ke panggilan hilir
Saat melakukan panggilan ke layanan hilir, sebarkan waktu yang tersisa sebagai batas waktu untuk menghindari gangguan pada panggilan jaringan yang akan hidup lebih lama dari permintaan Anda. Gunakan CancellationToken dengan klien bersama daripada membuat klien baru per pemanggilan:
using Amazon.S3; private static readonly IAmazonS3 s3 = new AmazonS3Client(); public async Task<string> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { var timeout = context.RemainingTime - TimeSpan.FromMilliseconds(500); if (timeout < TimeSpan.FromSeconds(1)) timeout = TimeSpan.FromSeconds(1); using var cts = new CancellationTokenSource(timeout); await s3.GetObjectAsync("my-bucket", "my-key", cts.Token); return "Done"; }
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 pelaksanaan 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.Instrumentation.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 untuk AWS Lambda (.NET)
Powertools untuk AWS Lambda (.NET) AWS dan Distro OpenTelemetry untuk - Instrumentasi DotNet untuk