Tratamento de exceções em fluxos Kafka

Thiru:

Tinha passado por vários lugares, mas a maioria deles estão relacionados com o tratamento de mensagens ruins não sobre a manipulação de exceção durante o processamento-los.

Eu quero saber a como lidar com as mensagens que são recebidos pela aplicação riacho e há uma exceção ao processar a mensagem? A exceção pode ser devido a várias razões, como falha de rede, RuntimeException etc.,

  • Alguém poderia sugerir qual é a maneira certa de fazer? Devo usar setUncaughtExceptionHandler? Ou há um jeito melhor?
  • Como lidar com tentativas?

Desde já, obrigado!!

Vasiliy Sarzhynskyi:

depende do que você quer fazer com excepções previstas do lado produtor. se exceção será lançada no produtor (por exemplo, devido à rede falha ou kafka corretor morreu), fluxo vai morrer por padrão. e com kafka-córregos versão 1.1.0 você pode substituir o comportamento padrão com a implementação de ProductionExceptionHandlercomo o seguinte:

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) {
    }

}

de método pega você poderia retornar tanto CONTINUEse você não quer fluxos morrendo na exceção, no retorno FAIL, caso você queira paradas Stream (FAIL é uma padrão). e você precisa especificar esta classe em config stream:

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

Também preste atenção que ProductionExceptionHandleralças únicas exceções no produtor, e ele não vai lidar com exceções durante o processamento mensagem com métodos de fluxo mapValues(..), filter(..), branch(..)etc, você precisa quebrar estes lógica método com blocos try / catch (colocar toda a sua lógica método em bloco try a garantia de que você vai lidar com todos os casos excepcionais):

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

Que eu saiba, não precisamos de exceções punho no lado do consumidor de forma explícita, como fluxos kafka tentará automaticamente consumindo mais tarde (como deslocamento não será alterado até que as mensagens serão consumidos e processados); por exemplo, se kafka corretor não será acessível por algum tempo, você vai tem exceções de Kafka córregos, e quando quebrado caberá, kafka fluxo vai consumir todas as mensagens. Portanto, neste caso teremos apenas atrasar e nada danificado / perdido.

com setUncaughtExceptionHandlervocê não será capaz de mudar o comportamento padrão como com ProductionExceptionHandler, com ele você só poderia log mensagem de erro ou enviar em tópico fracasso.

Acho que você gosta

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