DEV Community

Fabio José for Kafka BR

Posted on

Kafka: produtores idempotentes

"...idempotência é a propriedade que algumas operações têm de poderem ser aplicadas várias vezes sem que o valor do resultado se altere após a aplicação inicial."


Através de uma configuração simples no produtor Kafka, pode-se alcançar a idempotência na produção de eventos, eliminando completamente a possibilidade de duplicatas nos tópicos.


Uma das grandes qualidades do Kafka é a possibilidade de configurar a confiabilidade no produtor, que permite ajustes finos para atender com maestria aos requisitos não-funcionais dos casos de uso.

Uma dessas possibilidades é o produtor idempotente. Com ele existe a garantia de que não haverá duplicatas em nível de partição.

Essa garantia entra em ação quando a seguinte propriedade é definida como true:

enable.idempotence=true

Ao habilitar a idempotência no produtor, também será mandatório definir as seguintes configurações:

acks=all
max.in.flight.requests.per.connection=5

Com este setup, cada requisição que envia lotes de eventos ao Kafka terá um identificador único.

Cada lote na requisição tem como destino uma partição e um tópico

Ao chegar no kafka, esta requisição será processada e cada lote enviado ao líderes das respectivas partições. Ao terminar isso, o ack é devolvido ao produtor.

Mas esta é uma comunicação em rede. Então o atraso em receber o ack ou qualquer outro problema poderá provocar a retentativa padrão dos produtores Kafka. Assim, ele enviará novamente a requisição identificada.

O broker ao receber novamente àquela requisição processada com sucesso, apenas devolve o ack, sem persistir novamente e assim evitando a duplicação.

Sem o produtor idempotente, o broker receberia a requisição da retentiva como se fosse uma nova, persistindo novamente o lote de eventos, causando duplicatas.


É isso pessoal!

Até o próximo!!

Top comments (4)

Collapse
 
fabriciolfj profile image
fabriciolfj

Parabéns pelo post Fabio.
Gostaria de saber se esse recurso resolve o problema abaixo:
Tenho uma job schedulada, e está possui 5 instancias, ambas vão produzir a mesma mensagem quando der o time, essa opção vai descartar as mensagens duplicadas? Sei que o aws sqs já faz isso.

Collapse
 
fabiojose profile image
Fabio José

Obrigado Fabricio.

Se compreendi corretamente, não. Como são produtores diferentes, logo são origens diferentes e o Apache Kafka não implementa uma funcionalidade para este fim.

Collapse
 
andrecarvalho94 profile image
André Carvalho

Parabéns Fábio, com certeza é um pequeno detalhe que faz toda a diferença e não vemos isso sendo dito em todo lugar.
Mas fiquei com dúvida sobre o impacto disso em termos de desempenho.

Collapse
 
fabiojose profile image
Fabio José

Obrigado André.
A taxa de transferência diminui, mas nada drástico.

Pode usar sem grandes impactos na performance de produção.