es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El productor transaccional de Apache Kafka no respeta la atomicidad al publicar en 2 temas, si uno de los temas falla.

Estoy utilizando un productor transaccional de Kafka para publicar de manera atómica en 2 temas en un broker. Mi código se ve similar a esto:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("transactional.id", "my-transactional-id");
Producer<string, string=""> producer = new KafkaProducer<>(props, new StringSerializer(), new StringSerializer());

ProducerRecord<string, string=""> record1 = new ProducerRecord("topic-1", null, (Object) null, payload, headerList);
ProducerRecord<string, string=""> record2 = new ProducerRecord("topic-2", null, (Object) null, payload, headerList);
List<><string, string="">> recordList = Arrays.asList(record1, record2);

producer.initTransactions();

try {
     producer.beginTransaction();
     Iterator var2 = recordList.iterator();

     while(var2.hasNext()) {
         ProducerRecord<k, v=""> record = (ProducerRecord)var2.next();
         this.send(record, (Callback)null);
     }

     producer.commitTransaction();
} catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
     // No podemos recuperarnos de estas excepciones, por lo que nuestra única opción es cerrar el productor y salir.
     producer.close();
} catch (KafkaException e) {
     // Para todas las demás excepciones, simplemente abortamos la transacción y volvemos a intentarlo.
     producer.abortTransaction();
}
producer.close();

Ahora, para probar la atomicidad mientras publico en ambos temas, eliminé “topic-2”. Espero que la transacción falle por completo. Pero extrañamente, después de varios intentos, la transacción se confirma con éxito en “topic-1”.

Además, estoy viendo registros de error continuos con mensajes:

Error al obtener metadatos con ID de correlación 123:
{topic-2=UNKNOWN_TOPIC_OR_PARTITION}

Pero eventualmente dice:

Transición del estado IN_TRANSACTION a COMMITTING_TRANSACTION

y luego se publica con éxito en “topic-1”. No estoy seguro por qué veo este comportamiento. ¿Qué podría salir mal y se espera este comportamiento?</k,></string,></string,></string,></string,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según el código proporcionado, se está utilizando un productor transaccional de Kafka para publicar atómicamente en dos temas en un broker. Sin embargo, cuando se elimina uno de los temas, es decir, “topic-2”, y se inicia una transacción mediante producer.beginTransaction(), se espera que el productor falle al confirmar la transacción ya que no puede encontrar “topic-2”.

    El comportamiento inesperado observado podría deberse al hecho de que Kafka está diseñado para permitir la producción en temas no existentes durante las transacciones debido a que la creación y asignación de temas puede ocurrir de forma asíncrona. En tales casos, el productor envía una TopicAuthorizationException después de que los reintentos se hayan agotado.

    Los registros continuos de error con mensajes: “Error mientras se obtienen los metadatos con el id de correlación” indican que el productor está intentando obtener los metadatos del tema no existente y falla repetidamente. Eventualmente, el productor vuelve a intentarlo con éxito y pasa del estado IN_TRANSACTION a COMMITTING_TRANSACTION y publica con éxito en “topic-1”.

    Este comportamiento es esperado según la documentación de Kafka, y es importante manejar dichas excepciones y errores en el código del productor para evitar resultados inesperados.

Comments are closed.