Node.js'te DynamoDB BatchWriteItem (AWS SDK v3)
BatchWriteItem, tek bir istekte 25'e kadar öğe ekler veya siler (toplam 16 MB, öğe başına 400 KB). AWS SDK v3'te, RequestItems'ı PutRequest ve DeleteRequest girdilerini karıştıran bir BatchWriteItemCommand gönderirsiniz — ve UnprocessedItems üzerinde döngü yapmak zorundasınız, çünkü toplu istek bir bütün olarak atomik değildir.
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');Açıklama
RequestItems— tablo adı → en fazla 25PutRequest/DeleteRequestgirdisinden oluşan bir dizi şeklinde bir eşleme (bir istek birden çok tabloya yayılabilir). HerPutRequest.Itemtam birincil anahtara ihtiyaç duyar; herDeleteRequest.Keyyalnızca anahtardır.- Bir işlem değildir — her put/delete tek tek atomiktir, ancak toplu istek bir bütün olarak değildir: bazı yazmalar başarılı olurken diğerleri kısıtlanabilir. Ya hep ya hiç mi gerekiyor? TransactWriteItems'ı kullanın.
UnprocessedItems— yeniden deneme döngüsü isteğe bağlı değildir. Kısıtlanan yazmalar buradaRequestItemsbiçiminde döner ve yeniden gönderilmeye hazırdır; AWS, denemeler arasında üstel geri çekilmeyi şiddetle önerir.- Güncelleme yok, koşul yok —
BatchWriteItem,UpdateItem,ConditionExpressionveyaReturnValuesifade edemez; mevcut bir anahtara yapılan bir put, öğenin tamamının sessizce yerine geçer. Yinelenen anahtarlar, aynı öğede put+delete karıştırma, 25'ten fazla istek, 400 KB'ı aşan bir öğe ya da toplamda 16 MB'ı aşma; her biri DynamoDB'nin toplu isteğin tamamını reddetmesine neden olur. - Toplu işleme kapasiteyi değil, gidiş-dönüşleri kurtarır: her put/delete, tek tek olacağı aynı WCU'ları faturalandırır (var olmayan bir öğede yapılan bir delete yine de bir WCU faturalandırır).
Görsel olarak yapın
DynamoDB-JSON öğelerini elle bir araya getirmemeyi mi tercih edersiniz? DynamoDB Expression Builder, türlü değer eşlemeleri oluşturur ve çalıştırılabilir kodu kopyalar; öğe boyutu hesaplayıcı ise göndermeden önce her öğeyi 400 KB üst sınırına karşı kontrol eder.
Öğeleri bir grafik arayüzde (GUI) toplu eklemek, düzenlemek ve silmek için — yeniden deneme döngüleri yazmadan — DynoTable'ı indirin.
İlgili örnekler
- Python'da DynamoDB toplu yazma — boto3'ün
batch_writer()'ı yeniden deneme döngüsünü sizin için yapar. - AWS CLI ile DynamoDB BatchWriteItem — kabuktan aynı toplu yazma.
- Node.js'te DynamoDB TransactWriteItems — yazmalar birlikte başarılı olmalı veya başarısız olmalıysa.
- DynamoDB'de toplu işlemler — sınırlar, kısmi başarısızlık ve toplu işlemenin ne zaman kazandırdığı.
- "Too many items requested for the BatchWriteItem call" — bir toplu istekte 25'ten fazla put/delete isteği.
- "Provided list of item keys contains duplicates" — bir toplu istekte aynı anahtara dokunan iki istek.
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
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.