DynamoDB - Scrittura batch

La scrittura batch opera su più elementi creando o eliminando diversi elementi. Queste operazioni utilizzanoBatchWriteItem, che porta i limiti di non più di 16 MB di scritture e 25 richieste. Ogni elemento rispetta un limite di dimensione di 400 KB. Inoltre, le scritture batch non possono eseguire aggiornamenti degli articoli.

Cos'è la scrittura in batch?

Le scritture batch possono manipolare gli elementi su più tabelle. Il richiamo dell'operazione avviene per ogni singola richiesta, il che significa che le operazioni non si influenzano a vicenda e sono consentite combinazioni eterogenee; per esempio, unoPutItem e tre DeleteItemrichieste in un batch, con il fallimento della richiesta PutItem che non ha alcun impatto sulle altre. Le richieste non riuscite comportano la restituzione delle informazioni (chiavi e dati) relative a ciascuna richiesta non riuscita.

Note- Se DynamoDB restituisce degli elementi senza elaborarli, riprova; tuttavia, utilizzare un metodo di backoff per evitare un altro errore di richiesta basato sul sovraccarico.

DynamoDB rifiuta un'operazione di scrittura batch quando una o più delle seguenti istruzioni risultano vere:

  • La richiesta supera la velocità effettiva fornita.

  • La richiesta tenta di utilizzare BatchWriteItems per aggiornare un articolo.

  • La richiesta esegue più operazioni su un singolo elemento.

  • Le tabelle delle richieste non esistono.

  • Gli attributi dell'articolo nella richiesta non corrispondono al target.

  • Le richieste superano i limiti di dimensione.

Le scritture batch richiedono determinati file RequestItem parametri -

  • Necessità di operazioni di cancellazione DeleteRequest chiave subelements significa un nome e un valore di attributo.

  • Il PutRequest gli articoli richiedono un Item subelement significa un attributo e una mappa del valore dell'attributo.

Response - Un'operazione riuscita si traduce in una risposta HTTP 200, che indica caratteristiche come unità di capacità consumate, metriche di elaborazione delle tabelle e tutti gli elementi non elaborati.

Scrive in batch con Java

Eseguire una scrittura batch creando un'istanza di classe DynamoDB, a TableWriteItems istanza di classe che descrive tutte le operazioni e chiama il file batchWriteItem metodo per utilizzare l'oggetto TableWriteItems.

Note- È necessario creare un'istanza TableWriteItems per ogni tabella in una scrittura batch su più tabelle. Inoltre, controlla la tua risposta alla richiesta per eventuali richieste non elaborate.

Puoi rivedere il seguente esempio di scrittura batch:

DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient( 
   new ProfileCredentialsProvider()));  

TableWriteItems forumTableWriteItems = new TableWriteItems("Forum") 
   .withItemsToPut( 
   new Item() 
   .withPrimaryKey("Title", "XYZ CRM") 
   .withNumber("Threads", 0));  

TableWriteItems threadTableWriteItems = new TableWriteItems(Thread) 
   .withItemsToPut( 
   new Item() 
   .withPrimaryKey("ForumTitle","XYZ CRM","Topic","Updates") 
   .withHashAndRangeKeysToDelete("ForumTitle","A partition key value", 
   "Product Line 1", "A sort key value"));

BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem (
   forumTableWriteItems, threadTableWriteItems);

Il seguente programma è un altro esempio più ampio per una migliore comprensione di come un batch scrive con Java.

Note- L'esempio seguente può presupporre un'origine dati creata in precedenza. Prima di tentare l'esecuzione, acquisire le librerie di supporto e creare le origini dati necessarie (tabelle con caratteristiche richieste o altre fonti di riferimento).

Questo esempio utilizza anche Eclipse IDE, un file delle credenziali AWS e AWS Toolkit all'interno di un progetto Eclipse AWS Java.

package com.amazonaws.codesamples.document;

import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.BatchWriteItemOutcome;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.TableWriteItems;
import com.amazonaws.services.dynamodbv2.model.WriteRequest;

public class BatchWriteOpSample {  
   static DynamoDB dynamoDB = new DynamoDB(new AmazonDynamoDBClient( 
      new ProfileCredentialsProvider()));  
   static String forumTableName = "Forum"; 
   static String threadTableName = "Thread";  
      
   public static void main(String[] args) throws IOException { 
      batchWriteMultiItems();   
   }
   private static void batchWriteMultiItems() { 
      try {
         // Place new item in Forum 
         TableWriteItems forumTableWriteItems = new TableWriteItems(forumTableName) 
                                                                       //Forum 
            .withItemsToPut(new Item() 
            .withPrimaryKey("Name", "Amazon RDS") 
            .withNumber("Threads", 0));  
            
         // Place one item, delete another in Thread 
         // Specify partition key and range key 
         TableWriteItems threadTableWriteItems = new TableWriteItems(threadTableName) 
            .withItemsToPut(new Item() 
            .withPrimaryKey("ForumName","Product  
            Support","Subject","Support Thread 1") 
            .withString("Message", "New OS Thread 1 message")
            .withHashAndRangeKeysToDelete("ForumName","Subject", "Polymer Blaster", 
            "Support Thread 100"));  
            
         System.out.println("Processing request..."); 
         BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem (
               forumTableWriteItems, threadTableWriteItems);
         do {  
            // Confirm no unprocessed items 
            Map<String, List<WriteRequest>> unprocessedItems 
               = outcome.getUnprocessedItems();  
                  
            if (outcome.getUnprocessedItems().size() == 0) { 
               System.out.println("All items processed."); 
            } else { 
               System.out.println("Gathering unprocessed items..."); 
               outcome = dynamoDB.batchWriteItemUnprocessed(unprocessedItems); 
            }  
         } while (outcome.getUnprocessedItems().size() > 0);  
      } catch (Exception e) { 
         System.err.println("Could not get items: "); 
         e.printStackTrace(System.err); 
      }   
   } 
}