Node.js'te DynamoDB BatchGetItem (AWS SDK v3)
BatchGetItem, tek bir istekte birincil anahtara göre 100'e kadar öğe getirir. AWS SDK v3'te bu çağrının bir döngü olması gerekir, çünkü UnprocessedKeys bir hatayla değil, başarılı bir yanıtla gelir. Onu neyin doldurduğu ve 16 MB ile bölüm başına 1 MB'ın neden önemli sayılar olduğu DynamoDB'de toplu işlemler sayfasında ele alınır. Bu sayfa v3 çağrısının kendisi ve size geri verdikleri hakkındadır.
Kod
import {BatchGetItemCommand, 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: {
Keys: [
{Artist: {S: 'Arturo Sandoval'}, SongTitle: {S: 'Cubano Chant'}},
{Artist: {S: 'Arturo Sandoval'}, SongTitle: {S: 'A Mis Abuelos'}},
{Artist: {S: 'Ella Fitzgerald'}, SongTitle: {S: 'Misty'}}
]
}
};
const items = [];
let attempt = 0;
do {
const response = await client.send(new BatchGetItemCommand({RequestItems: requestItems}));
items.push(...(response.Responses?.Music ?? []));
// A partial result is NOT an error: throttling, a >16 MB response, or an
// internal failure returns the leftovers in UnprocessedKeys. Retry them
// with exponential backoff.
requestItems = response.UnprocessedKeys;
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(`Fetched ${items.length} items`);Açıklama
- İsteğe bağlı zincirleme savunmacı gürültü değildir.
ResponsesveUnprocessedKeysv3 türlerinde ikisi de isteğe bağlıdır; dolayısıylaresponse.Responses?.Music ?? []veObject.keys()koruması derleyicinin istediği şeydir. Düz JavaScript'te ise ilk boş yanıtın hata fırlatmasını engelleyen şeydir. err.nameüzerinden dallanın. v3 hizmet hata kodunu oraya koyar ve bu komutun gerçekten yükselttiği iki başarısızlık yeniden denenebilir değildir; dolayısıyla asla geri çekilme döngüsüne düşmemelidirler. 100'den fazla anahtarValidationException/Too many items requested for the BatchGetItem callverir; aynı anahtardan iki taneProvided list of item keys contains duplicatesverir. İkisi de Python sayfasında birebir yeniden üretilmiştir.UnprocessedKeyszatenRequestItemsbiçiminde gelir, ki döngünün onu doğrudan geri atayabilmesinin tek nedeni budur. Bir sayfalama imleci değildir ve çağrının başarısız olduğu anlamına gelmez.- Geri çekilme AWS'nin talimatıdır, bir incelik değil. API başvurusu "an exponential backoff algorithm" kullanmanızı söyler, çünkü anında yapılan bir yeniden deneme aynı kısıtlanmış bölüme çarpar.
ConsistentReadveProjectionExpressiontablo başınadır, en üst düzeyde değil herRequestItemsgirdisinin içinde ayarlanır. Eşleme tek anahtarlıyken ve düz bir istek gibi göründüğünde bunu kaçırmak kolaydır.
Yanıt gerçekte nasıl geri gelir
Yukarıdaki bloğu üç şarkının da mevcut olduğu DynamoDB Local 3.3.0'a karşı çalıştırın, ReturnConsumedCapacity: 'TOTAL' ekleyin ve sayı yerine şarkı adlarını günlüğe yazdırın:
order: [ 'A Mis Abuelos', 'Misty', 'Cubano Chant' ]
UnprocessedKeys: {}
ConsumedCapacity: [ { TableName: 'Music', CapacityUnits: 1.5 } ]İstek Cubano Chant, A Mis Abuelos, Misty'yi bu sırayla listeledi. Yanıt bu konumların hiçbirine uymaz; döngünün ofsete göre indekslemek yerine düz bir diziye eklemesinin nedeni budur. Öğeleri anahtar özniteliklerine göre isteklerle eşleştirin ve eşleştirecek bir şeyiniz kalsın diye o anahtarları her ProjectionExpression'a dahil edin.
Aynı Music girdisinde ConsistentRead: true ayarlayın; aynı üç anahtar 1,5 yerine 3 birime mal olur. Her biri 4 KB'ın altındaki üç öğe, üç ayrı GetItem okuması olarak, nihai tutarlıda yarım birim ve güçlü tutarlıda tam bir birim üzerinden faturalandırılır. Fiyatlandırma hesaplayıcısı, bir okuma desenine bağlanmadan önce bu öğe başına aritmetiği aylık bir sayıya çevirir.
Şimdi Misty'yi silin ve yeniden çalıştırın: iki öğe, boş bir UnprocessedKeys ve 1,0 birim. Eksik anahtar için hiçbir şey faturalandırılmadı. Bu bir DynamoDB Local artefaktıdır, sözleşme değil; BatchGetItem başvurusu (2026-07-28'de alındı), var olmayan öğelere yönelik isteklerin okuma türüne göre asgari okuma kapasitesini tükettiğini söyler. Bir önbellek ıskaları toplu işlemini yerel bir çalıştırmaya bakarak boyutlandırmayın.
Bir anahtar kümesini geri çekip önce döngüyü yazmadan gerçekte ne döndüğüne bakmak için DynoTable'ı indirin.
İlgili örnekler
- Python'da DynamoDB BatchGetItem — boto3 ile aynı toplu okuma.
- AWS CLI ile DynamoDB BatchGetItem — kabuktan aynı toplu okuma.
- Node.js'te DynamoDB GetItem — bunun topladığı tek öğelik okuma.
- DynamoDB'de toplu işlemler — sınırlar, kısmi başarısızlık ve toplu işlem ne zaman kazandırır.
- "Too many items requested for the BatchGetItem call" — tek istekte 100'den fazla anahtar.
- "Provided list of item keys contains duplicates" — tek toplu işlemde aynı anahtardan iki tane.
Kaynaklar
- BatchGetItem — 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-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.