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 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.
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.
Para configurar é muito simples. Basta adicionar o seguinte trecho no application.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.
Essa é a configuração que tem mais opções, mas é bem simples de entender:
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. Porém, achei que ficaria muita coisa.
Foi estranho fazer um post sem código, mas espero que tenham gostado!
Top comments (2)
Sim!!! O post ficou muito bom e bem explicativo!!! Valeu!!!
Massa cara, já me ajudou aqui com o artigo. Te devo uma breja