Configurando tratamento de erros no kafka com Quarkus
Tags: java, braziliandevs, quarkus, kafka
Published: 2021-03-05 00:13:48

Java é lindo. Quarkus é lindo. [Franz] Kafka é lindo. Porém, nem tudo são flores no desenvolvimento. Acidentes acontecem e é importante conseguirmos nos preparar para eles. Hoje, nós vamos ver sobre os diferentes tipos de tratamento de exceção durante o consumo de uma mensagem Kafka pelo Quarkus. 

Já vou assumir que você sabe o que é o Kafka, já manja um pouco de Quarkus e tem tudo configurado. Caso não seja o seu caso, tenho um [artigo infinitop](https://dev.to/lucasscharf/como-usar-kafka-num-projeto-quarkus-5d9c) para ajudar.

O Quarkus possui 3 formas diferentes para tratar uma exceção quando no método com a anotação **@Incoming**: Parar de consumir mensagens, ignorar e DLQ (_dead-letter queue_). 

#Parar de consumir mensagens
Esse é o tratamento padrão. O serviço continuará funcionando normalmente. Porém, as mensagens não serão mais consumidas até que alguém intervenha na mensagem, resolva o que precisar ser resolvido e então reinicie o serviço.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kjlo7mrgnpu0uuss9v85.jpeg)

Caso nada tenha sido configurado, será utilizado essa opção.

#Ignorar
Nesse modo, caso ocorra alguma exceção, o Quarkus diz pro Kafka que conseguiu consumir corretamente a mensagem e finge que o erro nunca existiu.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lage0tb3u5fgb969ffh8.jpg)

Para configurar é muito simples. Basta adicionar o seguinte trecho no application.properties:

```properties
mp.messaging.incoming.<nome do canal>.failure-strategy=ignore
```

#Dead-letter queue

Nesse modo, quando ocorre uma exceção, o Quarkus ainda irá informar ao Kafka que a mensagem foi consumida, porém, irá enviar a mensagem para uma fila especial onde essas mensagens poderão ser consumidas num momento oportuno.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4naf86ijgndhjsdj9xos.jpg)

Essa é a configuração que tem mais opções, mas é bem simples de entender:

```properties
mp.messaging.incoming.<nome do canal>.failure-strategy=dead-letter-queue
mp.messaging.incoming.<nome do canal>.dead-letter-queue.topic=<nome do tópico de DLQ>
mp.messaging.incoming.<nome do canal>.dead-letter-queue.key.serializer=<caminho para o serializador da chave>
mp.messaging.incoming.<nome do canal>.dead-letter-queue.value.serializer=<caminho para o serializador do valor da mensagem>
```

Por padrão, o nome do tópico será o "dead-letter-topic-" + nome do canal. Além disso, o Quarkus tentará supor o caminho para o serializador. É possível seguir o palpite dele, ou configurar manualmente. **O destino está nas suas mãos.**

Uma outra observação importante é que, se o tópico de DLQ não existe, então o Quarkus irá criar um novo tópico com as configurações padrões do Kafka (o que pode não ser a melhor abordagem possível).

#Considerações finais
Esse é um assunto bem interessante e que eu queria ter colocado lá no [outro post](https://dev.to/lucasscharf/como-usar-kafka-num-projeto-quarkus-5d9c). Porém, achei que ficaria muita coisa. 

Foi estranho fazer um post sem código, mas espero que tenham gostado!