Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Soporte de transacciones
Con Amazon Cloud Directory, a menudo es necesario añadir nuevos objetos o añadir relaciones entre los objetos nuevos y los existentes para reflejar los cambios en una jerarquía real. Las operaciones por lotes pueden hacer que resulte más sencillo administrar tareas de directorios como esta, lo que aporta los siguientes beneficios:
-
Las operaciones por lotes pueden minimizar el número de recorridos de ida y vuelta necesarios para escribir y leer objetos hacia y desde su directorio, lo que mejora el desempeño general de la aplicación.
-
La escritura por lotes proporciona la semántica de transacciones equivalente a bases de datos SQL. Todas las operaciones se completan correctamente o, si alguna operación tiene un error, no se aplica ninguna.
-
El uso de referencias de lotes le permite crear un objeto y utilizar una referencia al nuevo objeto para realizar otras acciones, como añadirlo a una relación, con lo que se reduce la sobrecarga asociada a usar una operación de lectura antes de una operación de escritura.
BatchWrite
Utilice operaciones BatchWrite para llevar a cabo varias operaciones de escritura en un directorio. Todas las operaciones de escritura por lotes se ejecutan de forma secuencial. Funciona de forma similar a las transacciones de bases de datos SQL. Si una de las operaciones de escritura por lotes falla, el efecto de toda la operación de escritura por lotes en el directorio será nulo. Si una operación de escritura por lotes falla, se produce una excepción de escritura por lotes. La excepción contiene el índice de la operación que ha fallado, además del tipo de excepción y el mensaje. Esta información puede ayudarle a identificar la causa raíz del error.
Las siguientes operaciones API se admiten como parte de la escritura por lotes:
Nombre de referencia de lote
Los nombres de referencia de lote solo son compatibles para operaciones de escritura por lotes cuando necesite hacer referencia a un objeto como parte de la operación por lotes intermedia. Por ejemplo, suponga que, como parte de una operación de escritura por lotes determinada, se desasocian 10 objetos diferentes para asociarse con otra parte distinta del directorio. Sin la referencia de lote, tendría que leer las 10 referencias de objeto y proporcionarlas como entrada en la nueva asociación como parte de la operación de escritura por lotes. Puede usar una referencia de lote para identificar el recurso desasociado durante el proceso de asociación. Las referencias de lote pueden ser cualquier cadena normal que lleve como prefijo la almohadilla o el símbolo de hashtag (#).
Por ejemplo, en la siguiente muestra de código, un objeto con el nombre de enlace "this-is-a-typo"
se desasocia de la raíz con un nombre de referencia de lote "ref"
. Más adelante, el mismo objeto se asocia a la raíz con el nombre de vínculo "correct-link-name"
. El objeto se identifica con la referencia secundaria establecida en la referencia de lote. Sin la referencia de lote, en un principio tendría que obtener el elemento objectIdentifier
que se va a desasociar y proporcionar el de la referencia secundaria durante la operación de asociación. Con un nombre de referencia de lote evitaría esta segunda operación de lectura adicional.
BatchDetachObject batchDetach = new BatchDetachObject() .withBatchReferenceName("ref") .withLinkName("this-is-a-typo") .withParentReference(new ObjectReference().withSelector("/")); BatchAttachObject batchAttach = new BatchAttachObject() .withParentReference(new ObjectReference().withSelector("/")) .withChildReference(new ObjectReference().withSelector("#ref")) .withLinkName("correct-link-name"); BatchWriteRequest batchWrite = new BatchWriteRequest() .withDirectoryArn(directoryArn) .withOperations(new ArrayList(Arrays.asList(batchDetach, batchAttach)));
BatchRead
Utilice operaciones BatchRead para realizar varias operaciones de lectura en un directorio. Por ejemplo, en la siguiente muestra de código, los elementos secundarios de objeto con la referencia “/managers”
se leen junto con los atributos de objeto con la referencia “/managers/bob”
en una sola operación de lectura por lotes.
BatchListObjectChildren listObjectChildrenRequest = new BatchListObjectChildren() .withObjectReference(new ObjectReference().withSelector("/managers")); BatchListObjectAttributes listObjectAttributesRequest = new BatchListObjectAttributes() .withObjectReference(new ObjectReference().withSelector("/managers/bob")); BatchReadRequest batchRead = new BatchReadRequest() .withConsistencyLevel(ConsistencyLevel.SERIALIZABLE) .withDirectoryArn(directoryArn) .withOperations(new ArrayList(Arrays.asList(listObjectChildrenRequest, listObjectAttributesRequest))); BatchReadResult result = cloudDirectoryClient.batchRead(batchRead);
BatchRead admite las siguientes operaciones API:
Límites de las operaciones por lotes
Cada solicitud al servidor (incluidas las solicitudes de lotes) tiene un número máximo de recursos en los que se puede operar, independientemente del número de operaciones en la solicitud. Esto le permite componer solicitudes de lotes con una alta flexibilidad mientras no supere las cantidades máximas de recursos. Para obtener más información sobre las cantidades máximas de recursos, consulte Límites en Amazon Cloud Directory.
Los límites se calculan sumando las escrituras o lecturas para cada operación dentro del lote. Por ejemplo, el límite de operación de lectura es actualmente de 200 objetos por cada llamada a API. Imaginemos que desea componer un lote que añade 9 llamadas a la API ListObjectChildren y cada llamada requiere la lectura de 20 objetos. Dado que el número total de objetos de lectura (9 x 20 = 180) no supera los 200, la operación por lotes se realizaría correctamente.
El mismo concepto se aplica con el cálculo de operaciones de escritura. Por ejemplo, el límite de la operación de escritura es actualmente 20. Si configura el lote para añadir 2 llamadas a la API UpdateObjectAttributes con 9 operaciones de escritura cada una, también se realizaría correctamente. En cualquier caso, si la operación por lotes supera el límite, la operación dará error y se generará una LimitExceededException
.
La forma correcta de calcular el número de objetos que se incluyen dentro de un lote consiste en incluir los objetos del nodo real o nodo_hijo y si se usa un enfoque basado en ruta para iterar el árbol de directorios, también tiene que incluir cada ruta que se itere, dentro del lote. Por ejemplo, tal y como se muestra en la siguiente ilustración de un árbol de directorios básico, para leer un valor de atributo para el objeto 003
, el recuento de lectura total de objetos sería tres.
El recorrido de lecturas a lo largo del árbol funciona así:
1. Leer el objeto 001
para determinar la ruta al objeto 003
2. Bajar a Path 2
3. Read object 003
Del mismo modo, para el número de atributos necesitamos contar el número de atributos en objetos 001
y 003
para asegurarnos de no superar el límite.
Tratamiento de excepciones
A veces, pueden dar error las operaciones Batch en Cloud Directory. En estos casos, es importante saber cómo tratar este tipo de errores. El método que se utiliza para resolver errores difiere para las operaciones de lectura y de escritura.
Errores de operación de escritura por lotes
Si una operación de escritura por lotes da error, Cloud Directory da error en toda la operación por lote y devuelva una excepción. La excepción contiene el índice de la operación que ha dado error, además del tipo de excepción y el mensaje. Si ve RetryableConflictException
, puede volver a intentarlo con retardo exponencial. Una manera sencilla de hacerlo es duplicar la cantidad de tiempo que espera cada vez que se obtiene una excepción o un error. Por ejemplo, si la primera operación de escritura por lotes da error, espere 100 milisegundos y vuelva intentar la solicitud. Si la segunda solicitud da error, espere 200 milisegundos y vuelva a intentarlo. Si la tercera solicitud da error, espere 400 milisegundos y vuelva a intentarlo.
Errores de operación de lectura por lotes
Si una operación de lectura por lotes da error, la respuesta contiene una respuesta correcta o una respuesta de excepción. Los errores de operaciones de lectura por lotes no hacen que toda la operación de lectura por lotes da error: Cloud Directory devuelve respuestas de error o de éxito individuales para cada operación.
Artículos relacionados con el blog de Cloud Directory