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, RequestItemsPutRequest 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 25 PutRequest/DeleteRequest girdisinden oluşan bir dizi şeklinde bir eşleme (bir istek birden çok tabloya yayılabilir). Her PutRequest.Item tam birincil anahtara ihtiyaç duyar; her DeleteRequest.Key yalnı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 burada RequestItems biçiminde döner ve yeniden gönderilmeye hazırdır; AWS, denemeler arasında üstel geri çekilmeyi şiddetle önerir.
  • Güncelleme yok, koşul yokBatchWriteItem, UpdateItem, ConditionExpression veya ReturnValues ifade 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

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.