Tablestore SDK for Java permite consumir datos de forma continua desde un túnel, procesar cada lote mediante una función de callback y configurar heartbeats, checkpoints, pools de hilos y la concurrencia de consumo.
Notas de uso
El periodo de retención de los registros incrementales coincide con el periodo de caducidad de los registros de Stream de la tabla y puede ser de hasta siete días. En un túnel BaseAndStream, si el consumo de datos completos no finaliza dentro de este periodo, se devuelve el error
OTSTunnelExpiredal iniciar el consumo de datos incrementales. El túnel no podrá continuar consumiendo datos incrementales.Si el consumo incremental se retrasa más allá del periodo de retención, el túnel podría reanudarse desde los datos disponibles más recientes. Como consecuencia, es posible que algunos datos no se consuman.
Un túnel caducado puede deshabilitarse. Si permanece deshabilitado durante más de 30 días, se elimina y no es posible restaurarlo.
Requisitos previos
Instale Tablestore SDK for Java y initialize TunnelClient.
Descripción de la función
TunnelWorker se conecta a un túnel mediante su ID, utiliza heartbeats para obtener los canales asignados al cliente actual, extrae datos de forma continua y pasa cada lote de registros a IChannelProcessor. Si varias instancias de TunnelWorker consumen el mismo túnel, el servidor distribuye los canales entre los clientes.
Para consumir datos desde un túnel:
Implemente
IChannelProcessor. Utilice el métodoprocesspara procesar cada lote y el métodoshutdownpara liberar los recursos que usa la función de callback.Cree un objeto
TunnelWorkerConfigpara configurar la función de callback y el comportamiento de consumo.Cree un
TunnelWorkercon el ID del túnel,TunnelClientyTunnelWorkerConfig.-
Llame a
connectAndWorkingpara iniciar el consumo.void process(ProcessRecordsInput input); void shutdown();
En el siguiente ejemplo se imprime cada registro extraído del túnel y luego se inicia el consumo.
private static class SimpleProcessor implements IChannelProcessor {
@Override
public void process(ProcessRecordsInput input) {
for (StreamRecord record : input.getRecords()) {
System.out.println(record);
}
}
@Override
public void shutdown() {
// Release resources used by the callback.
}
}
String tunnelId = "example_tunnel_id";
TunnelWorkerConfig config =
new TunnelWorkerConfig(new SimpleProcessor());
TunnelWorker worker =
new TunnelWorker(tunnelId, tunnelClient, config);
worker.connectAndWorking();
connectAndWorking retorna después de iniciar las tareas de consumo en segundo plano. Mantenga el proceso de la aplicación en ejecución. Para detener el consumo, llame a worker.shutdown(), config.shutdown() y tunnelClient.shutdown() en ese orden. worker.shutdown() cierra las conexiones del túnel e invoca el método shutdown de la función de callback. config.shutdown() detiene los pools de hilos de lectura, procesamiento y auxiliares. TunnelWorker registra un hook de apagado de JVM que intenta detener el worker, pero la aplicación debe liberar explícitamente estos recursos.
Parámetros
Worker
El constructor de TunnelWorker incluye los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
tunnelId (obligatorio) |
String |
El ID del túnel. Obténgalo al crear, listar o consultar túneles. |
|
client (obligatorio) |
TunnelClientInterface |
El |
|
workerConfig (obligatorio) |
TunnelWorkerConfig |
La configuración de la función de callback y del comportamiento de consumo. |
Configuración de consumo
workerConfig es de tipo TunnelWorkerConfig y contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
channelProcessor (obligatorio) |
IChannelProcessor |
La función de callback para el procesamiento de datos. Este parámetro es obligatorio cuando se utiliza el constructor de |
|
heartbeatTimeoutInSec (opcional) |
long |
El tiempo de espera del heartbeat en segundos. El valor predeterminado es |
|
heartbeatIntervalInSec (opcional) |
long |
El intervalo de heartbeat en segundos. El valor predeterminado es |
|
checkpointIntervalInMillis (opcional) |
long |
El intervalo con el que se registran los checkpoints de consumo en el servidor, en milisegundos. El valor predeterminado es |
|
clientTag (opcional) |
String |
Una etiqueta personalizada del cliente que se utiliza para generar un ID de cliente y distinguir las instancias de |
|
readRecordsExecutor (opcional) |
ThreadPoolExecutor |
El pool de hilos que extrae los datos. El pool predeterminado tiene |
|
processRecordsExecutor (opcional) |
ThreadPoolExecutor |
El pool de hilos que procesa los datos. Su configuración predeterminada es idéntica a la de |
|
maxChannelParallel (opcional) |
int |
El número máximo de canales desde los cuales se extraen y procesan datos simultáneamente. Utilice este parámetro para limitar el uso de memoria. El valor predeterminado es |
|
channelHelperExecutor (opcional) |
ThreadPoolExecutor |
El pool de hilos auxiliar que inicializa canales, programa pipelines y gestiona errores en tiempo de ejecución. Si no se establece este parámetro, se utiliza un pool de hilos en caché. |
|
maxRetryIntervalInMillis (opcional) |
int |
El intervalo base máximo para el backoff exponencial durante la extracción de datos incrementales, en milisegundos. El valor predeterminado es |
|
readMaxTimesPerRound (opcional) |
int |
El número máximo de llamadas a |
|
readMaxBytesPerRound (opcional) |
int |
La cantidad máxima de datos extraídos en una ronda de pipeline, en bytes. El valor predeterminado es |
|
enableClosingChannelDetect (opcional) |
boolean |
Especifica si se detectan en tiempo real los canales en estado |
Si inicia varias instancias de TunnelWorker en la misma máquina, puede reutilizar un único objeto TunnelWorkerConfig para compartir los pools de hilos de lectura y procesamiento. Una vez que todos los workers se detengan, llame a config.shutdown() solo una vez.
Datos de la función de callback
El método process recibe un objeto ProcessRecordsInput que contiene los siguientes campos.
|
Campo |
Tipo |
Descripción |
|
records |
|
Los registros extraídos en el lote actual. Llame a |
|
nextToken |
String |
El token para el siguiente lote. Llame a |
|
traceId |
String |
El ID de rastreo de la solicitud de extracción actual. Llame a |
|
channelId |
String |
El ID del canal al que pertenece el lote actual. Llame a |
Ejemplos de escenarios
Ajuste de parámetros de consumo
Si el throughput de consumo o el uso de memoria no cumplen con sus requisitos, ajuste los intervalos de heartbeat y checkpoint, la concurrencia de canales, la cantidad y el tamaño de las extracciones por ronda, así como el intervalo de backoff para las extracciones incrementales.
TunnelWorkerConfig config =
new TunnelWorkerConfig(new SimpleProcessor());
config.setHeartbeatIntervalInSec(10);
config.setHeartbeatTimeoutInSec(60);
config.setCheckpointIntervalInMillis(10_000);
config.setMaxChannelParallel(16);
config.setReadMaxTimesPerRound(4);
config.setReadMaxBytesPerRound(8 * 1024 * 1024);
config.setMaxRetryIntervalInMillis(3_000);