Pular para o conteúdo principal

Pergunta 29 de 50

Qual a diferença entre Auto Commit e Manual Commit?

SêniorTech Lead

Pergunta

"Qual a diferença prática entre Auto Commit e Manual Commit, e quando você usaria cada um?"

O que o entrevistador quer avaliar

Se você entende que a escolha entre auto e manual commit não é sobre conveniência de código, mas sobre qual risco (perda ou duplicidade) o sistema está disposto a aceitar.

Resposta rápida

Auto commit (enable.auto.commit=true) faz o client comitar offsets automaticamente em um intervalo periódico, sem relação direta com o término do processamento — pode comitar uma mensagem cujo processamento ainda está em andamento ou até falhou. Commit manual (enable.auto.commit=false com AckMode.MANUAL) exige que a aplicação chame acknowledgment.acknowledge() explicitamente, tipicamente só depois que o processamento terminou com sucesso.

Resposta nível Sênior

A diferença real está no risco que cada abordagem assume. Auto commit tende ao cenário de perda de mensagem: se o consumer cair entre o commit automático (que já aconteceu) e o fim real do processamento, essa mensagem é considerada processada pelo Kafka sem ter sido, de fato, processada com sucesso. Commit manual, feito estrategicamente depois que o processamento confirma sucesso, elimina esse risco de perda — mas ainda permite duplicidade: se o consumer cair entre o fim do processamento e o commit em si, a mensagem será reentregue no próximo início. Por isso, em sistemas financeiros, prefiro sempre commit manual combinado com processamento idempotente (Capítulo 11) — aceito duplicidade controlada em vez de arriscar perda silenciosa.

Explicação aprofundada

Veja "Os riscos de cada abordagem" no Capítulo 7.

Exemplo financeiro

Um consumer com auto commit processando pagamentos, se cair logo após um commit automático mas antes de persistir o resultado no banco, perde esse pagamento silenciosamente — sem log de erro, sem exceção, porque do ponto de vista do Kafka a mensagem já foi processada.

"Auto commit é mais simples, então é a escolha padrão segura"

Simplicidade de código não é sinônimo de segurança de dados. Para qualquer fluxo onde perda de mensagem é inaceitável, commit manual (com processamento idempotente) é a escolha correta, mesmo exigindo mais código.

Pode vir a seguir

Prováveis follow-ups: "o que é Retention Period?" e "como evitar processamento duplicado?".

Capítulos relacionados