Te acompaño a aprender kafka (nueve) - repetición de desplazamiento

¡Acostúmbrate a escribir juntos! Este es el quinto día de mi participación en el "Nuggets Daily New Plan·Desafío de actualización de abril", haz clic para ver los detalles del evento

definición

La reproducción de compensación de Kafka es restablecer la compensación del consumidor

Escenas

  • Los mensajes históricos deben volver a consumirse
  • migración de datos kafka

Estrategia

Dimensión de desplazamiento

más temprano

Ajustar el desplazamiento al primer desplazamiento actual

La estrategia más temprana significa ajustar el desplazamiento al desplazamiento más temprano actual del sujeto. Este primer desplazamiento no es necesariamente 0, porque en el entorno de producción, Kafka eliminará automáticamente los mensajes que están lejos, por lo que es probable que el primer desplazamiento actual sea un valor mayor que 0. Si desea volver a consumir todos los mensajes de un tema, puede utilizar la estrategia Más temprana.

Más reciente

Ajustar el desplazamiento al último desplazamiento actual

La última estrategia significa restablecer el desplazamiento al último desplazamiento final. Si envía un total de 15 mensajes a un tema, el último turno final es 15. Si desea omitir todos los mensajes históricos y comenzar a consumir desde el último mensaje, puede usar la última estrategia

Actual

Ajuste el desplazamiento al último desplazamiento de compromiso actual

La estrategia actual significa ajustar el desplazamiento al último desplazamiento actualmente presentado por el consumidor. A veces puede encontrarse con un escenario de este tipo: modifica el código del programa del consumidor y reinicia el consumidor, y resulta que hay un problema con el código, necesita revertir los cambios de código anteriores y también restablecer el desplazamiento al consumidor La ubicación en el momento del reinicio, luego, la estrategia actual puede ayudarlo a lograr esta función.

Compensación especificada

Ajustar el desplazamiento al desplazamiento especificado

La estrategia de compensación especificada es una estrategia más general, lo que significa que el consumidor ajusta el valor de compensación a la compensación que usted especifique. Un caso de uso típico para esta estrategia es que cuando un programa consumidor procesa un mensaje de error, puede "omitir" manualmente el procesamiento de este mensaje. En el uso real, puede haber casos en los que los mensajes corruptos no se puedan consumir. En este momento, el programa del consumidor generará una excepción y no podrá seguir funcionando. Una vez que encuentre este problema, puede intentar usar la estrategia de compensación especificada para evitarlo.

Desplazamiento por N

Ajustar el desplazamiento al desplazamiento actual + N (N puede ser negativo)

Si la estrategia de Desplazamiento especificado requiere que especifique el valor absoluto del desplazamiento, entonces la estrategia Shift-By-N especifica el valor relativo del desplazamiento, es decir, puede dar la distancia de un mensaje para ser saltado. El "salto" aquí es bidireccional, puedes "saltar" hacia adelante o hacia atrás. Por ejemplo, si desea restablecer el desplazamiento a los primeros 100 desplazamientos del desplazamiento actual, debe especificar N como -100

dimensión de tiempo

Fecha y hora

Ajustar el desplazamiento al desplazamiento mínimo mayor que el tiempo dado

DateTime le permite especificar una hora y luego restablecer el desplazamiento al primer desplazamiento después de esa hora. Un escenario de uso común es que desea volver a consumir los datos de ayer, luego puede usar esta estrategia para restablecer el desplazamiento a las 0 en punto de ayer.

Duración

Ajuste el desplazamiento al desplazamiento del intervalo especificado desde la hora actual

La estrategia de duración se refiere a un intervalo de tiempo relativo dado y luego ajusta el desplazamiento al desplazamiento del intervalo de tiempo dado actual. El formato específico es PnDTnHnMnS. Si está familiarizado con la clase Duration introducida en Java 8, no debería estar familiarizado con este formato. Es un formato de duración que cumple con la especificación ISO-8601, comenzando con la letra P, seguida de 4 partes, a saber, D, H, M y S, que representan días, horas, minutos y segundos respectivamente. Por ejemplo, si desea volver a establecer el desplazamiento a hace 15 minutos, puede especificar PT0H15M0S.

funcionar

API

El método de búsqueda de KafkaConsumer, o sus métodos variantes seekToBeginning y seekToEnd.

package org.apache.kafka.clients.consumer; 
..... 
public class KafkaConsumer implements Consumer { 
    ..... 
    @Override public void seek(TopicPartition partition, long offset) {
        .... 
    } 
    public void seekToBeginning(Collection partitions) { 
        .... 
    } 
    public void seekToEnd(Collection partitions) {
        .... 
    } 
        .... 
}
复制代码

Ejemplo de implementación

Implementación más temprana

Properties consumerProperties = new Properties(); 
...... 
String topic = "test"; // 要重设位移的 Kafka 主题 
try (final KafkaConsumer consumer = 
    new KafkaConsumer<>(consumerProperties)) { 
        consumer.subscribe(Collections.singleton(topic)); 
        consumer.poll(0); 
        consumer.seekToBeginning( consumer.partitionsFor(topic).stream().map(partitionInfo -> 
        new TopicPartition(topic, partitionInfo.partition())) 
        .collect(Collectors.toList()));
}
复制代码

Última implementación

consumer.seekToEnd( 
    consumer.partitionsFor(topic).stream().map(partitionInfo -> 
    new TopicPartition(topic, partitionInfo.partition())) 
    .collect(Collectors.toList()));

复制代码

Implementación actual

consumer.partitionsFor(topic).stream().map(info -> 
    new TopicPartition(topic, info.partition())) .forEach(tp -> { 
    long committedOffset = consumer.committed(tp).offset(); 
    consumer.seek(tp, committedOffset); });
复制代码

Implementación de compensación especificada

long targetOffset = 1234L; 
for (PartitionInfo info : consumer.partitionsFor(topic)) { 
    TopicPartition tp = new TopicPartition(topic, info.partition()); 
    consumer.seek(tp, targetOffset); 
}
复制代码

Implementación de cambio por N

for (PartitionInfo info : consumer.partitionsFor(topic)) { 
    // 假设向前跳 123 条消息 
    TopicPartition tp = new TopicPartition(topic, info.partition()); 
    long targetOffset = consumer.committed(tp).offset() + 123L; 
    consumer.seek(tp, targetOffset); 
}
复制代码

implementación de tiempo de datos

long ts = LocalDateTime.of( 
2020, 7, 20, 20, 0).toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); 
Map timeToSearch = consumer.partitionsFor(topic).stream().map(info -> 
new TopicPartition(topic, info.partition())) 
.collect(Collectors.toMap(Function.identity(), tp -> ts)); 
for (Map.Entry entry : consumer.offsetsForTimes(timeToSearch).entrySet()) {   
    consumer.seek(entry.getKey(), entry.getValue().offset()); 
}
复制代码

Duración implementación

Map timeToSearch = 
consumer.partitionsFor(topic).stream() 
.map(info -> new TopicPartition(topic, info.partition())) .collect(Collectors.toMap(Function.identity(), tp -> 
System.currentTimeMillis() - 30 * 1000 * 60)); 
for (Map.Entry entry : 
    consumer.offsetsForTimes(timeToSearch).entrySet()) { 
    consumer.seek(entry.getKey(), entry.getValue().offset()); 
}
复制代码

Terminar

Si necesita comunicarse y aprender, puede prestar atención a la cuenta pública [Revisar el antiguo y conocer el nuevo Java], aprender unos de otros y progresar juntos.

Supongo que te gusta

Origin juejin.im/post/7085225980905652255
Recomendado
Clasificación