

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
<a name="lambda-managed-instances-nodejs-runtime"></a>

Untuk runtime Node.js, Instans Terkelola Lambda menggunakan thread pekerja `async` dengan eksekusi berbasis`await`/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
<a name="lambda-managed-instances-nodejs-max-concurrency"></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 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
<a name="lambda-managed-instances-nodejs-building"></a>

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 gunakan`AsyncLocalStorage`.

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
<a name="lambda-managed-instances-nodejs-callback-handlers"></a>

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](https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html) di Node.js.

## Direktori bersama/tmp
<a name="lambda-managed-instances-nodejs-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 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.

## Pencatatan log
<a name="lambda-managed-instances-nodejs-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. 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](nodejs-logging.md#node-js-logging-advanced).

Pustaka logging pihak ketiga yang populer, seperti [Winston](https://github.com/winstonjs/winston), biasanya menyertakan dukungan untuk menggunakan konsol untuk keluaran log.

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

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.

Gunakan `context.getRemainingTimeInMillis()` 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-nodejs-init-shutdown"></a>

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 pelaksanaan Lambda](lambda-runtime-environment.md)

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

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 ()
<a name="lambda-managed-instances-nodejs-powertools"></a>

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](https://github.com/aws-powertools/powertools-lambda-typescript) ().

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