"...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)
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.
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.
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.
Obrigado André.
A taxa de transferência diminui, mas nada drástico.
Pode usar sem grandes impactos na performance de produção.