DynamoDB: recuperación por lotes

Las operaciones de recuperación por lotes devuelven atributos de uno o varios elementos. Estas operaciones generalmente consisten en utilizar la clave principal para identificar los elementos deseados. losBatchGetItem las operaciones están sujetas a los límites de las operaciones individuales, así como a sus propias restricciones únicas.

Las siguientes solicitudes en las operaciones de recuperación por lotes dan como resultado el rechazo:

  • Solicite más de 100 artículos.
  • Realice una solicitud que exceda el rendimiento.

Las operaciones de recuperación por lotes realizan un procesamiento parcial de solicitudes que tienen el potencial de exceder los límites.

For example- una solicitud para recuperar varios elementos lo suficientemente grandes como para exceder los límites resulta en parte del procesamiento de la solicitud, y un mensaje de error que indica la parte no procesada. Cuando se devuelvan elementos sin procesar, cree una solución de algoritmo de retroceso para administrar esto en lugar de limitar las tablas.

los BatchGetlas operaciones se realizan eventualmente con lecturas consistentes, lo que requiere modificaciones para obtener lecturas fuertemente consistentes. También realizan recuperaciones en paralelo.

Note- El orden de los artículos devueltos. DynamoDB no ordena los elementos. Tampoco indica la ausencia de los elementos solicitados. Además, esas solicitudes consumen unidades de capacidad.

Todas las operaciones de BatchGet requieren RequestItems parámetros como la coherencia de lectura, los nombres de los atributos y las claves primarias.

Response - Una operación exitosa da como resultado una respuesta HTTP 200, que indica características como unidades de capacidad consumidas, métricas de procesamiento de tablas y cualquier elemento no procesado.

Recuperaciones por lotes con Java

El uso de Java en las operaciones BatchGet requiere la creación de una instancia de clase DynamoDB, TableKeysAndAttributes instancia de clase que describe una lista de valores de clave primaria para los elementos y pasa el objeto TableKeysAndAttributes al BatchGetItem método.

El siguiente es un ejemplo de una operación BatchGet:

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

TableKeysAndAttributes forumTableKeysAndAttributes = new TableKeysAndAttributes 
   (forumTableName);
   
forumTableKeysAndAttributes.addHashOnlyPrimaryKeys (
   "Title",
   "Updates",  
   "Product Line 1"
); 
TableKeysAndAttributes threadTableKeysAndAttributes = new TableKeysAndAttributes (
   threadTableName);
      
threadTableKeysAndAttributes.addHashAndRangePrimaryKeys (
   "ForumTitle",
   "Topic",  
   "Product Line 1",
   "P1 Thread 1", 
   "Product Line 1",
   "P1 Thread 2", 
   "Product Line 2",
   "P2 Thread 1"
); 
BatchGetItemOutcome outcome = dynamoDB.batchGetItem ( 
   forumTableKeysAndAttributes, threadTableKeysAndAttributes);
      
for (String tableName : outcome.getTableItems().keySet()) { 
   System.out.println("Table items " + tableName); 
   List<Item> items = outcome.getTableItems().get(tableName); 
   for (Item item : items) { 
      System.out.println(item); 
   } 
}

Puede revisar el siguiente ejemplo más grande.

Note- El siguiente programa puede asumir una fuente de datos creada previamente. Antes de intentar ejecutar, adquiera bibliotecas de soporte y cree las fuentes de datos necesarias (tablas con las características requeridas u otras fuentes referenciadas).

Este programa también utiliza Eclipse IDE, un archivo de credenciales de AWS y AWS Toolkit dentro de un proyecto Eclipse AWS Java.

package com.amazonaws.codesamples.document;

import java.io.IOException;
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.BatchGetItemOutcome;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.TableKeysAndAttributes;
import com.amazonaws.services.dynamodbv2.model.KeysAndAttributes;

public class BatchGetOpSample { 
   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 { 
      retrieveMultipleItemsBatchGet(); 
   }
   private static void retrieveMultipleItemsBatchGet() {         
      try { 
         TableKeysAndAttributes forumTableKeysAndAttributes = 
            new TableKeysAndAttributes(forumTableName); 
         
         //Create partition key 
         forumTableKeysAndAttributes.addHashOnlyPrimaryKeys (
            "Name", 
            "XYZ Melt-O-tron", 
            "High-Performance Processing"
         ); 
         TableKeysAndAttributes threadTableKeysAndAttributes = 
            new TableKeysAndAttributes(threadTableName); 
         
         //Create partition key and sort key 
         threadTableKeysAndAttributes.addHashAndRangePrimaryKeys (
            "ForumName",
            "Subject",  
            "High-Performance Processing",
            "HP Processing Thread One", 
            "High-Performance Processing",
            "HP Processing Thread Two", 
            "Melt-O-Tron",
            "MeltO Thread One"
         );
         System.out.println("Processing..."); 
         BatchGetItemOutcome outcome = dynamoDB.batchGetItem(forumTableKeysAndAttributes,
            threadTableKeysAndAttributes); 
              
         Map<String, KeysAndAttributes> unprocessed = null;    
         do { 
            for (String tableName : outcome.getTableItems().keySet()) { 
               System.out.println("Table items for " + tableName); 
               List<Item> items = outcome.getTableItems().get(tableName); 
               
               for (Item item : items) { 
                  System.out.println(item.toJSONPretty()); 
               } 
            } 
            // Confirm no unprocessed items 
            unprocessed = outcome.getUnprocessedKeys(); 
                 
            if (unprocessed.isEmpty()) { 
               System.out.println("All items processed."); 
            } else { 
               System.out.println("Gathering unprocessed items..."); 
               outcome = dynamoDB.batchGetItemUnprocessed(unprocessed); 
            } 
         } while (!unprocessed.isEmpty()); 
      } catch (Exception e) { 
         System.err.println("Could not get items."); 
         System.err.println(e.getMessage()); 
      }   
   } 
}