A Armadilha nos Tutoriais de Backend

Tutoriais mostram um processo simples. Receber um webhook. Atualizar o banco de dados. Retornar um 200 OK.

Seu código funciona nos testes. Você o envia para produção. Então, você vê registros duplicados no seu banco de dados. Usuários recebem créditos em dobro. As entradas de dados se acumulam.

Tutoriais ignoram a realidade das falhas de rede.

O Problema: Redes Não Confiáveis Redes falham. Seu servidor pode processar dados lentamente. Um erro de DNS pode impedir que sua resposta 200 OK chegue ao remetente.

Quando um serviço não recebe sua confirmação, ele tenta novamente. Ele envia o mesmo webhook de novo. Se o seu código aceitar cada requisição, você criará duplicatas.

A Solução: Idempotência Idempotência significa que fazer múltiplas requisições idênticas tem o mesmo efeito que uma única requisição.

Pense no botão de um elevador. Apertar o botão do 5º andar uma vez diz ao elevador para onde ir. Apertá-lo dez vezes não envia o elevador para o 50º andar. O resultado permanece o mesmo.

Seu webhook deve agir como esse botão.

Como Corrigir Siga estes passos para construir webhooks seguros:

  • Encontre o ID único do evento.
  • Verifique no seu banco de dados se esse ID existe antes de fazer qualquer coisa.
  • Se o ID existir, pare. Retorne um 200 OK para que o remetente pare de tentar novamente.
  • Se o ID for novo, processe os dados.
  • Salve o ID do evento no seu banco de dados imediatamente.

Exemplo de Lógica em Node.js:

const eventId = req.body.event_id;

const existingEvent = await db.processedEvents.findUnique({
  where: { id: eventId }
});

if (existingEvent) {
  return res.status(200).send('Already processed');
}

await updateUserData(req.body.data);
await db.processedEvents.create({ data: { id: eventId } });

return res.status(200).send('Success');

Construir sistemas para condições perfeitas é fácil. Construir sistemas para falhas é engenharia de verdade.

Você já lidou com dados duplicados devido a tentativas de reenvio? Como você lida com a idempotência?

Fonte: https://dev.to/anubhavg23/the-hidden-trap-in-backend-tutorials-why-your-webhooks-are-creating-duplicate-data-and-how-to-fix-dba