Exactly-Once-Verarbeitung mit Webhooks handhaben

Hallo zusammen, ich habe mit einem fortgeschritteneren Zuverlässigkeitsproblem in n8n bei webhook-gesteuerten Workflows zu kämpfen.
Ich habe einen Workflow:
Webhook → Verarbeitung → Datenbank
Der externe Service wiederholt manchmal dasselbe Webhook-Event (z. B. wegen Timeouts), daher erhält n8n doppelte Anfragen mit derselben Payload.
Dies führt derzeit zu:
• Doppelten Datensätzen in der Datenbank
• Doppelten nachgelagerten Aktionen (E-Mails, API-Aufrufe usw.)
Beispiel-Payload:
{
“event_id”: “abc123”,
“user_id”: 42,
“action”: “created”
}
Wenn dieselbe event_id zweimal gesendet wird, wird sie zweimal verarbeitet.
Was ich bereits versucht habe
• Grundlegende Überprüfungen in einem Function-Node
• Datenbank-Upserts
• Verzögerungen hinzufügen
Aber keines dieser Verfahren garantiert vollständig eine Eins-zu-eins-Verarbeitung.
Die Herausforderung
Ich möchte sicherstellen:
• Jedes Event wird nur einmal verarbeitet
• Sichere Handhabung von Wiederholungen
• Keine doppelten Nebenwirkungen

Beschreiben Sie das Problem/den Fehler/die Frage

Wie lautet die Fehlermeldung (falls vorhanden)?

Bitte teilen Sie Ihren Workflow

(Wählen Sie die Nodes auf Ihrer Canvas aus und verwenden Sie die Tastaturkombinationen CMD+C/STRG+C und CMD+V/STRG+V zum Kopieren und Einfügen des Workflows.)

Geben Sie die Ausgabe des letzten Nodes aus

Informationen zu Ihrem n8n-Setup

  • n8n-Version:
  • Datenbank (Standard: SQLite):
  • n8n EXECUTIONS_PROCESS-Einstellung (Standard: own, main):
  • n8n wird ausgeführt über (Docker, npm, n8n cloud, Desktop-App):
  • Betriebssystem:

Hi @Keira_Becky Du hast es mit einem Idempotenz-Problem zu tun, und die einzige zuverlässige Lösung ist, verarbeitete Events zu tracken – es gibt kein eingebautes “exactly-once” in n8n.

Nutze die event_id als eindeutigen Schlüssel und lass deine Datenbank das durchsetzen.

Versuche folgendes:

  1. Speichere event_id in der DB mit UNIQUE-Constraint

CREATE TABLE events (
event_id TEXT PRIMARY KEY,
payload JSONB
);

  1. Füge vor der Verarbeitung ein

INSERT INTO events (event_id, payload)
VALUES ({{$json.event_id}}, {{$json}})
ON CONFLICT (event_id) DO NOTHING;

Also: Wenn das Einfügen erfolgreich ist → verarbeite das Event
Wenn es zu einem Konflikt kommt → überspringe es (bereits verarbeitet)

Danke @Niffzy

Ich habe es behoben, indem ich es vor der Verarbeitung eingefügt habe