Manejo de excepciones en las corrientes de Kafka

thiru:

Había pasado por varios puestos, pero la mayoría de ellos están relacionados con el manejo de mensajes incorrectos no se trata de manejo de excepciones al procesar ellos.

Quiero saber cómo manejar los mensajes que se han recibido por la aplicación A de trenes y hay una excepción al procesar el mensaje? La excepción podría ser debido a varias razones como la falta de red, etc. RuntimeException,

  • Podría alguien sugerir cuál es la forma correcta de hacerlo? Debo usar setUncaughtExceptionHandler? ¿O hay un mejor camino?
  • Cómo manejar reintentos?

¡¡Gracias por adelantado!!

Vasiliy Sarzhynskyi:

depende de lo que usted quiere hacer con excepciones por parte de los productores. si excepción será lanzada en productor (por ejemplo, debido a la red falla o kafka broker ha muerto), corriente morirá de forma predeterminada. y con kafka-arroyos versión 1.1.0 que podría anular el comportamiento por defecto mediante la aplicación ProductionExceptionHandlercomo la siguiente:

public class CustomProductionExceptionHandler implements ProductionExceptionHandler {

    @Override
    public ProductionExceptionHandlerResponse handle(final ProducerRecord<byte[], byte[]> record,
                                                     final Exception exception) {
        log.error("Kafka message marked as processed although it failed. Message: [{}], destination topic: [{}]",  new String(record.value()), record.topic(), exception);
        return ProductionExceptionHandlerResponse.CONTINUE;
    }

    @Override
    public void configure(final Map<String, ?> configs) {
    }

}

del método de mango se podía volver ya sea CONTINUEsi no quiere morir en corrientes excepción, en el retorno FAILen caso de que quiera paradas de flujo (muelle es un defecto). Y se necesita especificar esta clase en config corriente:

default.production.exception.handler=com.example.CustomProductionExceptionHandler

También prestar atención de que ProductionExceptionHandlerlas manijas únicas excepciones sobre el productor, y no va a manejar excepciones durante el procesamiento de mensajes con los métodos de flujo mapValues(..), filter(..), branch(..)etc, que necesitan para envolver éstos lógica del método con los bloques try / catch (poner toda su lógica del método en bloque try para garantizar que va a manejar todos los casos excepcionales):

.filter((key, value) -> { try {..} catch (Exception e) {..} })

que yo sepa, no necesitamos a excepciones de la manija en el lado del consumidor de manera explícita, como corrientes kafka se consume intentar automáticamente después (una vez deducidas no cambiará hasta que los mensajes serán consumidos y transformados); por ejemplo, agente si Kafka no será alcanzable desde hace algún tiempo, se consiguió excepciones de kafka corrientes, y cuando se rompen será de hasta, kafka corriente va a consumir todos los mensajes. por lo que en este caso habremos simplemente retrasar y nada dañado / perdido.

con setUncaughtExceptionHandlerusted no será capaz de cambiar el comportamiento por defecto como con ProductionExceptionHandler, la que sólo se podía registrar mensaje de error o de envío en tema fracaso.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=136471&siteId=1
Recomendado
Clasificación