Runtime Node.js 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.

Runtime Node.js untuk Instans Terkelola Lambda

Untuk runtime Node.js, Instans Terkelola Lambda menggunakan thread pekerja async dengan eksekusi berbasisawait/untuk menangani permintaan bersamaan. Inisialisasi fungsi terjadi sekali per thread pekerja. Pemanggilan bersamaan ditangani di dua dimensi: utas pekerja menyediakan paralelisme di seluruh v, dan eksekusi asinkron memberikan CPUs konkurensi dalam setiap utas. Setiap permintaan bersamaan yang ditangani oleh thread pekerja yang sama berbagi objek handler dan status global yang sama, memerlukan penanganan yang aman di bawah beberapa permintaan bersamaan.

Konkurensi maksimum

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 Node.js, 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 thread pekerja dan kapasitas setiap thread pekerja untuk memproses permintaan bersamaan secara asinkron. Jumlah default thread pekerja ditentukan oleh jumlah v yang CPUs tersedia, atau Anda dapat mengonfigurasi jumlah thread 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 penangan fungsi Anda sinkron, setiap thread pekerja hanya dapat memproses satu permintaan pada satu waktu.

Membangun fungsi untuk multi-konkurensi

Dengan penangan fungsi async, setiap pekerja runtime memproses beberapa permintaan secara bersamaan. Objek global akan dibagikan di beberapa permintaan bersamaan. Untuk objek yang bisa berubah, hindari menggunakan status global atau gunakanAsyncLocalStorage.

AWS Klien SDK aman asinkron dan tidak memerlukan penanganan khusus.

Contoh: Negara global

Kode berikut menggunakan objek global yang bermutasi di dalam fungsi handler. Ini tidak aman untuk 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 fungsi handler 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. Bergantung pada pustaka koneksi yang digunakan, ini mungkin tidak aman secara 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 aman konkurensi adalah dengan menggunakan kumpulan koneksi. Pool 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 handler berbasis callback

Saat menggunakan Node.js 22, Anda tidak dapat menggunakan penangan fungsi berbasis panggilan balik dengan Instans Terkelola Lambda. Handler berbasis callback 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 Instans Terkelola Lambda.

Sebagai gantinya, gunakan penangan async fungsi saat menggunakan Instans Terkelola Lambda. Untuk informasi selengkapnya, lihat Mendefinisikan penangan fungsi Lambda di Node.js.

Direktori bersama/tmp

/tmpDirektori dibagikan di semua permintaan bersamaan di lingkungan eksekusi. Menulis bersamaan ke file yang sama dapat menyebabkan kerusakan data, misalnya jika proses 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. Ketika Anda menggunakan console logger, secara otomatis requestId disertakan dalam setiap entri log. Untuk informasi lebih lanjut, lihat Menggunakan kontrol logging lanjutan Lambda dengan Node.js.

Pustaka logging pihak ketiga yang populer, seperti Winston, biasanya menyertakan dukungan untuk menggunakan konsol untuk keluaran log.

Konteks permintaan

Menggunakan context.awsRequestId menyediakan akses async-safe ke ID permintaan untuk permintaan saat ini.

Gunakan context.xRayTraceId 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 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 saat dimatikan. Sinyal ini digunakan oleh ekstensi untuk memicu tugas pembersihan, seperti pembilasan buffer. 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, lihat Memahami siklus hidup lingkungan eksekusi 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 TypeScript Lambda ()

Powertools for AWS Lambda TypeScript () kompatibel dengan Instans Terkelola Lambda dan menyediakan utilitas untuk pencatatan, penelusuran, metrik, dan lainnya. Untuk informasi selengkapnya, lihat Powertools untuk AWS Lambda TypeScript ().

Langkah selanjutnya