Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Node.js runtime untuk Instans Terkelola Lambda
Untuk Node.js runtime, Lambda Managed Instances menggunakan thread pekerja dengan eksekusi await berbasisasync/untuk menangani permintaan bersamaan. Inisialisasi fungsi terjadi sekali per thread pekerja. Pemanggilan bersamaan ditangani di dua dimensi: utas pekerja menyediakan paralelisme di seluruh vCPU, dan eksekusi asinkron menyediakan konkurensi dalam setiap utas. Setiap permintaan bersamaan yang ditangani oleh thread pekerja yang sama berbagi objek handler dan status global yang sama, membutuhkan penanganan yang aman di bawah beberapa permintaan bersamaan.
Konkurensi maksimum
Jumlah maksimum permintaan bersamaan yang dikirim Lambda ke setiap lingkungan eksekusi dikendalikan oleh PerExecutionEnvironmentMaxConcurrency pengaturan dalam konfigurasi fungsi. Ini adalah pengaturan opsional, dan nilai default bervariasi tergantung pada runtime. Untuk Node.js runtime, defaultnya adalah 64 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.
Untuk Node.js, jumlah permintaan bersamaan yang dapat diproses oleh setiap lingkungan eksekusi ditentukan oleh jumlah utas pekerja dan kapasitas setiap utas pekerja untuk memproses permintaan bersamaan secara asinkron. Jumlah default utas pekerja ditentukan oleh jumlah vCPU yang tersedia, atau Anda dapat mengonfigurasi jumlah utas pekerja dengan menyetel variabel AWS_LAMBDA_NODEJS_WORKER_COUNT lingkungan. Sebaiknya gunakan penangan fungsi async karena ini memungkinkan pemrosesan beberapa permintaan per utas pekerja. Jika pengendali fungsi Anda sinkron, setiap thread pekerja hanya dapat memproses satu permintaan pada satu waktu.
Membangun fungsi untuk multi-konkurensi
Dengan pengendali fungsi async, setiap pekerja runtime memproses beberapa permintaan secara bersamaan. Objek global dibagikan di beberapa permintaan bersamaan. Untuk objek yang dapat berubah, hindari menggunakan status atau penggunaan AsyncLocalStorage global.
AWS Klien SDK aman asinkron dan tidak memerlukan penanganan khusus.
Contoh: Negara global
Kode berikut menggunakan objek global yang bermutasi di dalam handler fungsi. Ini tidak aman asinkron.
let state = { currentUser: null, requestData: null }; export const handler = async (event, context) => { state.currentUser = event.userId; state.requestData = event.data; await processData(state.requestData); // state.currentUser might now belong to a different request return { user: state.currentUser }; };
Menginisialisasi state objek di dalam pengendali fungsi menghindari status global bersama.
export const handler = async (event, context) => { let state = { currentUser: event.userId, requestData: event.data }; await processData(state.requestData); return { user: state.currentUser }; };
Contoh: Koneksi database
Kode berikut menggunakan objek klien bersama yang dibagi antara beberapa pemanggilan. Tergantung pada pustaka koneksi yang digunakan, ini mungkin tidak aman untuk konkurensi.
const { Client } = require('pg'); // Single connection created at init time const client = new Client({ host: process.env.DB_HOST, database: process.env.DB_NAME, user: process.env.DB_USER, password: process.env.DB_PASSWORD }); // Connect once during cold start client.connect(); exports.handler = async (event) => { // Multiple parallel invocations share this single connection = BAD // With multi-concurrent Lambda, queries will collide const result = await client.query('SELECT * FROM users WHERE id = $1', [event.userId]); return { statusCode: 200, body: JSON.stringify(result.rows[0]) }; };
Pendekatan yang aman untuk bersaing adalah dengan menggunakan kumpulan koneksi. Kumpulan menggunakan koneksi terpisah untuk setiap kueri database bersamaan.
const { Pool } = require('pg'); // Connection pool created at init time const pool = new Pool({ host: process.env.DB_HOST, database: process.env.DB_NAME, user: process.env.DB_USER, password: process.env.DB_PASSWORD, max: 20, // Max connections in pool idleTimeoutMillis: 30000, connectionTimeoutMillis: 2000 }); exports.handler = async (event) => { // Pool gives each parallel invocation its own connection const result = await pool.query('SELECT * FROM users WHERE id = $1', [event.userId]); return { statusCode: 200, body: JSON.stringify(result.rows[0]) }; };
Node.js 22 penangan berbasis panggilan balik
Saat menggunakan Node.js 22, Anda tidak dapat menggunakan pengendali fungsi berbasis panggilan balik dengan Instans Terkelola Lambda. Callback-based penangan hanya didukung untuk fungsi Lambda (default). Untuk runtime Node.js 24 dan yang lebih baru, penangan fungsi berbasis callback tidak digunakan lagi untuk Lambda (default) dan Lambda Managed Instances.
Sebagai gantinya, gunakan pengen async dali fungsi saat menggunakan Lambda Managed Instances. Untuk informasi selengkapnya, lihat Men definisikan pengendali fungsi Lambda di Node.js.
Direktori /tmp yang dibagikan
Direk /tmp tori dibagikan di semua permintaan bersamaan di lingkungan eksekusi. Penulisan bersamaan ke file yang sama dapat menyebabkan kerusakan data, misalnya jika proses lain mengganti file. Untuk mengatasi hal ini, 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
Interleaving log (entri log dari permintaan berbeda yang disisipkan dalam log) normal dalam sistem multi-concurrent. Fungsi yang menggunakan Instans Terkelola Lambda selalu menggunakan format log JSON terstruktur yang diperkenalkan dengan kontrol logging lanjutan. Format ini mencakuprequestId, memungkinkan entri log untuk dikorelasikan dengan satu permintaan. Ketika Anda menggunakan console logger, secara otomatis requestId disertakan dalam setiap entri log. Untuk informasi lebih lanjut, lihatMenggunakan kontrol logging lanjutan Lambda dengan Node.js.
Pustaka logging pihak ketiga yang populer, seperti Winston
Permintaan konteks
Menggunakan context.awsRequestId menyediakan akses async-safe ke ID permintaan untuk permintaan saat ini.
Gunakan context.xRayTraceId untuk mengakses ID X-Ray jejak. Ini menyediakan akses aman secara bersamaan ke ID jejak untuk permintaan saat ini. Lambda tidak mendukung variabel _X_AMZN_TRACE_ID lingkungan dengan Lambda Managed Instances. ID X-Ray jejak disebarkan secara otomatis saat menggunakan AWS SDK.
Gunakan context.getRemainingTimeInMillis() 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 dimulai. Konfigur BUFFER_MS asikan berdasarkan durasi yang diharapkan dari potongan pekerjaan Anda berikutnya.
const BUFFER_MS = 2000; // Configure based on your next chunk of work exports.handler = async (event, context) => { for (const item of event.items) { if (context.getRemainingTimeInMillis() < BUFFER_MS) return { statusCode: 206, body: "Timeout approaching, stopping early" }; await processItem(item); } return { 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 ketergantungan pada panggilan jaringan yang akan bertahan lebih lama dari panggilan Anda:
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3"); const client = new S3Client({}); exports.handler = async (event, context) => { const timeout = Math.max(1000, context.getRemainingTimeInMillis() - 500); const response = await client.send( new GetObjectCommand({ Bucket: "my-bucket", Key: "my-key" }), { abortSignal: AbortSignal.timeout(timeout) } ); return { statusCode: 200, body: "Done" }; };
Inisialisasi dan shutdown
Inisialisasi fungsi terjadi sekali per thread pekerja. Anda mungkin melihat entri log berulang jika fungsi Anda memancarkan log selama inisialisasi.
Untuk fungsi Lambda dengan ekstensi, lingkungan eksekusi memancarkan sinyal SIGTERM selama shutdown. Sinyal ini digunakan oleh ekstensi untuk memicu tugas pembersihan, seperti buffer pembilasan. Fungsi Lambda (default) dengan ekstensi juga dapat berlangganan sinyal SIGTERM menggunakan. process.on() Ini tidak didukung untuk fungsi yang menggunakan Instans Terkelola Lambda karena process.on() tidak dapat digunakan dengan utas pekerja. Untuk mempelajari lebih lanjut tentang siklus hidup lingkungan eksekusi, lihatMemahami siklus hidup lingkungan pelaksanaan Lambda.
Versi ketergantungan
Instans Terkelola Lambda memerlukan versi paket minimum berikut:
-
AWS SDK untuk JavaScript v3: versi 3.933.0 atau yang lebih baru
-
AWS X-Ray SDK untuk Node.js: versi 3.12.0 atau yang lebih baru
-
AWS Distro untuk OpenTelemetry - Instrumentasi untuk JavaScript: versi 0.8.0 atau yang lebih baru
-
Powertools untuk AWS Lambda (TypeScript): versi 2.29.0 atau yang lebih baru
Powertools untuk AWS Lambda () TypeScript
Powertools for AWS Lambda (TypeScript) kompatibel dengan Lambda Managed Instances dan menyediakan utilitas untuk logging, pelacakan, metrik, dan banyak lagi. Untuk informasi selengkapnya, lihat Powertools for AWS Lambda ()TypeScript.
Langkah selanjutnya
-
Tinjau runtime Java untuk Instans Terkelola Lambda
-
Tinjau runtime Python untuk Instans Terkelola Lambda
-
Tinjau runtime .NET untuk Instans Terkelola Lambda
-
Pelajari tentang penskalaan Instans Terkelola Lambda