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!!

Latest comments (4)

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.

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.