Entrega exactly once através de uma rede não é possível, mas processamento exactly once é, dentro de certos limites. O Kafka oferece um producer idempotente somado a transações, então um ciclo read process write dentro do Kafka comita offsets e saída de forma atômica. De ponta a ponta, você ainda precisa que o destino coopere, seja com uma escrita transacional, seja com um upsert idempotente em uma chave estável. Na prática, a maioria dos times fica com at least once mais destinos idempotentes.
Por que os entrevistadores perguntam isso
Essa é uma checagem de profundidade em raciocínio sobre sistemas distribuídos. Respostas fracas dizem enable.idempotence igual a true e param por aí. Os entrevistadores querem ouvir a distinção entre entrega e processamento, o limite de escopo das transações do Kafka (elas só cobrem tópicos do Kafka e offsets de consumidor) e a realidade pragmática de que destinos idempotentes são o que de fato deixa um pipeline correto de ponta a ponta.
Como estruturar sua resposta
- Separe entrega exactly once de processamento exactly once.
- Explique o producer idempotente e qual duplicata ele elimina.
- Descreva as transações cobrindo saída e commit de offset de forma atômica.
- Diga o limite: destinos externos não estão dentro da transação.
- Termine em at least once mais escritas idempotentes como a resposta prática.
Exemplo de resposta
Estritamente falando, não. Você não consegue garantir entrega exactly once através de uma rede não confiável, porque um reconhecimento sempre pode se perder e o remetente tem que escolher entre reenviar ou descartar. O que o Kafka de fato oferece é semântica de processamento exactly once dentro do Kafka. O producer idempotente adiciona um id de producer e um número de sequência, então um envio repetido não cria uma duplicata na partição, e as transações permitem comitar os seus registros de saída e os seus offsets de consumidor de forma atômica, então uma topologia read process write não conta em dobro em caso de falha. O limite é o escopo. No momento em que você escreve no Postgres ou no S3, essa escrita está fora da transação. Então o que eu realmente construo é entrega at least once com um destino idempotente, normalmente um merge em um id de evento ou em uma chave natural. Em um pipeline de clickstream nós deduplicávamos por event_id com uma janela de sete dias, o que era mais barato e mais fácil de raciocinar do que tentar tornar cada salto transacional.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- O que o transactional.id faz e por que ele importa no restart?
- Como você deduplicaria um stream sem estado ilimitado?
- Qual é o custo de performance de habilitar transações?
Mais perguntas para Engenheiro de Dados
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas