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