DynamoDB BatchWriteItem di Node.js (AWS SDK v3)

BatchWriteItem menaruh atau menghapus hingga 25 item dalam satu request (total 16 MB, 400 KB per item). Di AWS SDK v3 Anda mengirim BatchWriteItemCommand yang RequestItems-nya mencampur entri PutRequest dan DeleteRequest — dan Anda harus melakukan loop pada UnprocessedItems, karena batch secara keseluruhan tidak bersifat atomik.

Code

import {BatchWriteItemCommand, DynamoDBClient} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({region: 'us-east-1'});

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

let requestItems = {
  Music: [
    {
      PutRequest: {
        Item: {
          Artist: {S: 'Arturo Sandoval'},
          SongTitle: {S: 'Cubano Chant'},
          AlbumTitle: {S: 'Danzon'},
          Year: {N: '1994'}
        }
      }
    },
    {
      PutRequest: {
        Item: {
          Artist: {S: 'Arturo Sandoval'},
          SongTitle: {S: 'A Mis Abuelos'},
          AlbumTitle: {S: 'Danzon'},
          Year: {N: '1994'}
        }
      }
    },
    {
      DeleteRequest: {
        Key: {Artist: {S: 'Ella Fitzgerald'}, SongTitle: {S: 'Misty'}}
      }
    }
  ]
};

let attempt = 0;

do {
  const response = await client.send(new BatchWriteItemCommand({RequestItems: requestItems}));

  // Writes that were throttled come back in UnprocessedItems — resubmit them
  // with exponential backoff until the map is empty.
  requestItems = response.UnprocessedItems;
  if (requestItems && Object.keys(requestItems).length > 0) {
    attempt += 1;
    await sleep(Math.min(100 * 2 ** attempt, 5000));
  }
} while (requestItems && Object.keys(requestItems).length > 0);

console.log('Batch written');

Penjelasan

  • RequestItems — map dari nama tabel → array hingga 25 entri PutRequest/DeleteRequest (satu request bisa mencakup beberapa tabel). Setiap PutRequest.Item membutuhkan primary key lengkap; setiap DeleteRequest.Key hanyalah key-nya.
  • Bukan transaksi — setiap put/delete bersifat atomik secara individual, tetapi batch secara keseluruhan tidak: sebagian penulisan bisa berhasil sementara yang lain di-throttle. Butuh all-or-nothing? Gunakan TransactWriteItems.
  • UnprocessedItems — loop retry bukan opsional. Penulisan yang di-throttle kembali di sini dalam bentuk RequestItems, siap dikirim ulang; AWS sangat menyarankan exponential backoff di antara percobaan.
  • Tanpa update, tanpa kondisiBatchWriteItem tidak bisa mengekspresikan UpdateItem, ConditionExpression, atau ReturnValues; sebuah put pada key yang sudah ada diam-diam menggantikan seluruh item. Key duplikat, mencampur put+delete pada item yang sama, >25 request, item >400 KB, atau total >16 MB masing-masing menyebabkan DynamoDB menolak seluruh batch.
  • Batching menghemat perjalanan bolak-balik, bukan kapasitas: setiap put/delete menagih WCU yang sama seperti jika dilakukan secara individual (delete pada item yang tidak ada tetap menagih satu WCU).

Lakukan secara visual

Lebih suka tidak merakit item DynamoDB-JSON dengan tangan? DynamoDB Expression Builder membangun map nilai bertipe dan menyalin kode yang bisa dijalankan, dan kalkulator ukuran item memeriksa setiap item terhadap batas 400 KB sebelum Anda mengirimnya.

Untuk menambah, mengedit, dan menghapus item secara massal dalam GUI — tanpa loop retry untuk ditulis — unduh DynoTable.

Contoh terkait

References

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

DynoTable adalah klien desktop yang cepat untuk DynamoDB — jelajahi tabel, jalankan query gaya SQL, dan edit Item secara lokal.