

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.

# Implementar la desagregación de consumidores
<a name="kinesis-kpl-consumer-deaggregation"></a>

A partir de la versión 1.4.0, KCL es compatible con la desagrupación automática de registros de usuario de KPL. El código de la aplicación de consumidor escrito con versiones anteriores de KCL se compilará sin ningún tipo de modificación después de actualizar KCL. Sin embargo, si la agregación de KPL se utiliza en el lado del productor, existe un matiz relacionado con la creación de puntos de control: todos los subregistros de un registro agregado tienen el mismo número de secuencia, de modo que los datos adicionales deben almacenarse con el punto de control si es necesario hacer una distinción entre subregistros. Estos datos adicionales se denominan *números subsecuenciales*.

**Topics**
+ [Migrar de versiomrd anteriores de KCL](#kinesis-kpl-consumer-deaggregation-migration)
+ [Usar extensiones de KCL para la desagrupación de KPL](#kinesis-kpl-consumer-deaggregation-extensions)
+ [Úselo GetRecords directamente](#kinesis-kpl-consumer-deaggregation-getrecords)

## Migrar de versiomrd anteriores de KCL
<a name="kinesis-kpl-consumer-deaggregation-migration"></a>

No es necesario cambiar las llamadas existentes para crear puntos de control con la agregación. La recuperación de todos los registros almacenados correctamente en Kinesis Data Streams seguirá estando garantizada. Ahora, KCL ofrece dos nuevas operaciones de puntos de control para casos de uso particulares que se describen a continuación.

Si el código existente se hubiera escrito para KCL antes de que fuera compatible con KPL y se llama a la operación del punto de control sin argumentos, esto equivaldría a la creación de puntos de control para el número de secuencia del último registro de usuario de KPL en el lote. Si la operación de punto de comprobación se llama con una cadena de número secuencial, equivaldrá a la creación de un punto de comprobación para el número secuencial determinado del lote junto con el número subsecuencial implícito 0 (cero).

La llamada a la nueva operación de punto de control de KCL `checkpoint()` sin argumentos equivale semánticamente a hacer un punto de control del número de secuencia de la última llamada de `Record` en el lote, junto con el número subsecuencial implícito 0 (cero). 

La llamada a la nueva operación de punto de control de KCL `checkpoint(Record record)` equivale semánticamente a hacer un punto de control del número secuencial del `Record` dado, junto con el número subsecuencial implícito 0 (cero). Si la llamada al `Record` es realmente un `UserRecord`, el número secuencial de `UserRecord` y el número subsecuencial se someten a un punto de comprobación. 

La llamada a la nueva operación de punto de control de KCL `checkpoint(String sequenceNumber, long subSequenceNumber)` crea explícitamente un punto de control del número secuencial dado junto con el número subsecuencial dado. 

En cualquiera de estos casos, después de que el punto de control se almacene en la tabla de Amazon DynamoDB, KCL puede reanudar correctamente la recuperación de los registros, incluso cuando la aplicación se bloquee y se reinicie. Si la secuencia contiene más registros, la recuperación se produce a partir del registro con el siguiente número subsecuencial dentro del registro con el número secuencial que se haya comprobado más recientemente. Si el punto de comprobación más reciente incluyó el último número subsecuencial del registro con el número secuencial anterior, la recuperación se produce a partir del registro con el siguiente número secuencial. 

En la siguiente sección se explican los detalles de la comprobación secuencial y subsecuencial para los consumidores que deban evitar la omisión y la duplicación de registros. Si la omisión (o duplicación) de registros al detener y reiniciar el procesamiento de registros del consumidor no resulta importante, puede ejecutar su código existente sin modificaciones.

## Usar extensiones de KCL para la desagrupación de KPL
<a name="kinesis-kpl-consumer-deaggregation-extensions"></a>

La desagrupación de KPL puede implicar la creación de puntos de control subsecuenciales. Para facilitar el uso de la creación de puntos de control subsecuenciales, se ha agregado una clase `UserRecord` a KCL:

```
public class UserRecord extends Record {     
    public long getSubSequenceNumber() {
    /* ... */
    }      
    @Override 
    public int hashCode() {
    /* contract-satisfying implementation */ 
    }      
    @Override 
    public boolean equals(Object obj) {
    /* contract-satisfying implementation */ 
    } 
}
```

Esta categoría es la que se usa ahora en lugar de `Record`. Esto no afecta al código existente, porque es una subclase de `Record`. La clase `UserRecord` representa tanto subregistros reales como registros estándares no agregados. Se pueden describir los registros no agregados como registros agregados con solo un subregistro.

Además, se han añadido dos nuevas operaciones a `IRecordProcessorCheckpointer`:

```
public void checkpoint(Record record); 
public void checkpoint(String sequenceNumber, long subSequenceNumber);
```

Para empezar a utilizar la creación de puntos de comprobación de números subsecuenciales, puede realizar la siguiente conversión. Cambie el siguiente código de formulario:

```
checkpointer.checkpoint(record.getSequenceNumber());
```

Nuevo código de formulario:

```
checkpointer.checkpoint(record);
```

Le recomendamos que use el formulario `checkpoint(Record record)` para la generación de puntos de comprobación subsecuenciales. Sin embargo, si ya está almacenando `sequenceNumbers` en cadenas para la creación de puntos de comprobación, ahora también deberá almacenar `subSequenceNumber`, tal y como se muestra en el ejemplo siguiente:

```
String sequenceNumber = record.getSequenceNumber(); 
long subSequenceNumber = ((UserRecord) record).getSubSequenceNumber();  // ... do other processing  
checkpointer.checkpoint(sequenceNumber, subSequenceNumber);
```

La difusión de `Record` a `UserRecord` siempre se realiza correctamente, ya que en la implementación siempre se usa `UserRecord`. A no ser que sea necesario realizar cálculos aritméticos en los números secuenciales, no recomendamos este enfoque.

Al procesar los registros de usuario de KPL, KCL escribe el número subsecuencial en Amazon DynamoDB como un campo adicional para cada fila. Las versiones anteriores de KCL utilizaban `AFTER_SEQUENCE_NUMBER` para obtener los registros al reanudar los puntos de control. KCL actual con compatibilidad con KPL utiliza `AT_SEQUENCE_NUMBER` en su lugar. Cuando se recupera el registro del número secuencial del punto de comprobación, se comprueba el número secuencial sometido al punto de comprobación, y los subregistros se descartan según proceda (podrían ser todos ellos, si el último subregistro es el del punto de comprobación). De nuevo, se pueden entender los registros no agregados como registros agregados con un único subregistro, de modo que el mismo algoritmo funciona tanto para los registros agregados como para los no agregados.

## Úselo GetRecords directamente
<a name="kinesis-kpl-consumer-deaggregation-getrecords"></a>

También puede optar por no utilizar KCL e invocar en su lugar la operación de la API `GetRecords` directamente para recuperar registros de Kinesis Data Streams. Para desempaquetar estos registros recuperados en el registro de usuario original de KPL, llame a una de las siguientes operaciones estáticas en `UserRecord.java`:

```
public static List<Record> deaggregate(List<Record> records)

public static List<UserRecord> deaggregate(List<UserRecord> records, BigInteger startingHashKey, BigInteger endingHashKey)
```

La primera operación utiliza el valor predeterminado `0` (cero) para `startingHashKey` y el valor predeterminado `2^128 -1` para `endingHashKey`.

Cada una de estas operaciones desagrupa la lista de registros de Kinesis Data Streams especificada y genera una lista de registros de usuario de KPL. Cualquier registro de usuario de KPL cuya clave hash explícita o clave de partición quede fuera del rango entre `startingHashKey` (incluida) y `endingHashKey` (incluida) se descarta de la lista de registros devuelta.