Pergunta de entrevista para Desenvolvedor Full Stack

Como você garantiria que um webhook de pagamento nunca cobre nem provisione um cliente duas vezes?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

Trate a entrega como pelo menos uma vez e torne o handler idempotente. Verifique a assinatura primeiro, depois guarde o id do evento do provedor atrás de uma restrição de unicidade e retorne 200 na hora se você já viu aquilo. Faça a mudança de estado e a inserção do id dentro de uma transação só, para uma queda não aplicar aquilo pela metade. Mantenha o handler rápido enfileirando o trabalho lento, e deixe o provedor tentar de novo quando você genuinamente falhar.

Por que os entrevistadores perguntam isso

Pagamentos são onde bugs de corretude custam dinheiro e confiança, então o entrevistador quer evidência de que você pensou sobre garantias de entrega distribuída. Ele está escutando idempotência imposta no banco em vez de com um conjunto em memória, verificação de assinatura, e o que o seu handler retorna em caso de falha. Candidatos que rodaram isso em produção normalmente citam eventos fora de ordem, que é o segundo bug em que todo mundo esbarra.

Como estruturar sua resposta

  • Estabeleça que a entrega de webhook é pelo menos uma vez.
  • Descreva a idempotência imposta por uma restrição de unicidade.
  • Coloque o efeito e o marcador em uma transação só.
  • Explique o que você retorna em sucesso e em falha.

Exemplo de resposta

Exemplo falado, em primeira pessoa

A premissa de onde eu parto é que o provedor vai entregar o mesmo evento mais de uma vez, fora de ordem, e às vezes horas depois, porque as três coisas acontecem. Então o handler verifica a assinatura e o timestamp primeiro, depois insere o id do evento do provedor em uma tabela processed_events com um índice único. Se aquela inserção conflita, a gente já tratou, e eu retorno 200 direto em vez de fazer o trabalho de novo. O detalhe importante é que a inserção e o efeito de verdade, conceder a assinatura ou registrar o pagamento, acontecem na mesma transação, para um processo morrendo no meio não deixar um sem o outro. Qualquer coisa lenta, como mandar um e-mail de recibo, vai para uma fila com a própria chave de idempotência. Eu também guardo o timestamp do evento e ignoro um evento mais antigo que o estado que eu já tenho, que é o que te salva quando um cancelamento chega antes do upgrade que o precedeu. Em falhas eu retorno um 500 de propósito para o provedor tentar de novo, e eu alerto se um evento cair na fila de mensagens mortas.

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 funciona

Perguntas de acompanhamento que você pode esperar

  • O que você faz quando os eventos chegam fora de ordem?
  • Como você reprocessaria eventos depois de corrigir um bug no handler?
  • Como você lida com uma mensagem que falha em toda tentativa?

Mais perguntas para Desenvolvedor Full Stack

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

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot