Die Falle in Backend-Tutorials

Tutorials zeigen dir einen einfachen Prozess. Empfange einen Webhook. Aktualisiere die Datenbank. Gib ein 200 OK zurück.

Dein Code funktioniert beim Testen. Du pushst ihn in die Produktion. Dann siehst du Duplikate in deiner Datenbank. Nutzern werden Beträge doppelt gutgeschrieben. Dateneinträge häufen sich an.

Tutorials ignorieren die Realität von Netzwerkausfällen.

Das Problem: Unzuverlässige Netzwerke Netzwerke versagen. Dein Server verarbeitet Daten vielleicht langsam. Ein DNS-Fehler könnte verhindern, dass deine 200 OK-Antwort den Absender erreicht.

Wenn ein Dienst keine Bestätigung erhält, versucht er es erneut. Er sendet denselben Webhook noch einmal. Wenn dein Code jede Anfrage akzeptiert, erzeugst du Duplikate.

Die Lösung: Idempotenz Idempotenz bedeutet, dass mehrere identische Anfragen dieselbe Wirkung haben wie eine einzige Anfrage.

Stell dir einen Aufzugknopf vor. Einmaliges Drücken des Knopfes für Stockwerk 5 sagt dem Aufzug, wohin er fahren soll. Zehnmaliges Drücken schickt den Aufzug nicht in das 50. Stockwerk. Das Ergebnis bleibt dasselbe.

Dein Webhook muss sich wie dieser Knopf verhalten.

So behebst du es Befolge diese Schritte, um sichere Webhooks zu bauen:

  • Finde die eindeutige ID des Events.
  • Prüfe deine Datenbank auf diese ID, bevor du irgendetwas tust.
  • Wenn die ID existiert, brich ab. Gib ein 200 OK zurück, damit der Absender keine weiteren Versuche unternimmt.
  • Wenn die ID neu ist, verarbeite die Daten.
  • Speichere die Event-ID sofort in deiner Datenbank.

Beispiel-Logik in 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');

Systeme für perfekte Bedingungen zu bauen, ist einfach. Systeme für den Ausfallfall zu bauen, ist echte Ingenieurskunst.

Hast du schon einmal mit Duplikaten durch Retries zu tun gehabt? Wie gehst du mit Idempotenz um?

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