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 entriPutRequest/DeleteRequest(satu request bisa mencakup beberapa tabel). SetiapPutRequest.Itemmembutuhkan primary key lengkap; setiapDeleteRequest.Keyhanyalah 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 bentukRequestItems, siap dikirim ulang; AWS sangat menyarankan exponential backoff di antara percobaan.- Tanpa update, tanpa kondisi —
BatchWriteItemtidak bisa mengekspresikanUpdateItem,ConditionExpression, atauReturnValues; 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
- Penulisan batch DynamoDB di Python — loop retry manual yang disembunyikan batch_writer.
- DynamoDB BatchWriteItem dengan AWS CLI — penulisan batch yang sama dari shell.
- DynamoDB TransactWriteItems di Node.js — ketika penulisan harus berhasil atau gagal bersama.
- Operasi batch di DynamoDB — batas, kegagalan parsial, dan kapan batching sepadan.
- "Too many items requested for the BatchWriteItem call" — lebih dari 25 request put/delete dalam satu batch.
- "Provided list of item keys contains duplicates" — dua request menyentuh key yang sama dalam satu batch.
References
- BatchWriteItem — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.