Zwei Systeme verbinden, ohne unterwegs Daten zu verlieren
Wiederholungen, Idempotenz und Nachvollziehbarkeit: die drei Dinge, die eine funktionierende Integration von einer unterscheiden, die nur so aussieht.
Fast jede kaputte Integration, die ich reparieren musste, fing gleich an: Jemand hat ein Skript geschrieben, das auf der einen Seite liest und auf der anderen schreibt. Es lief. Man ließ es laufen. Sechs Monate später fehlen Rechnungen, und niemand weiß, seit wann.
Das Skript war nicht schlecht geschrieben. Ihm fehlten drei Dinge, nach denen im ersten Gespräch niemand fragt, weil man sie nicht sieht, bis sie versagen.
1. Das Netz fällt aus, und zwar im schlechtesten Moment
Wenn Ihr Code eine API aufruft, gibt es drei mögliche Enden: Es hat geklappt, es ist gescheitert, oder Sie wissen es nicht. Das dritte ist das interessante.
Bricht die Verbindung ab, nachdem die Anfrage raus ist, aber bevor die Antwort ankommt, protokolliert Ihre Seite einen Fehler und die andere Seite einen Neuanlage. Sie wiederholen — und jetzt gibt es zwei Rechnungen.
Die Antwort ist nicht “weniger wiederholen”. Sie ist, mit Verstand zu wiederholen:
- Exponentielles Backoff mit Jitter. Wiederholen Sie jede Sekunde, hämmern beim Ausfall der Gegenseite alle Ihre Prozesse gleichzeitig darauf und hindern sie am Hochkommen. Warten Sie 1 s, 2 s, 4 s, 8 s, und legen Sie bis zu einer Sekunde Zufall obendrauf, damit sie sich nicht synchronisieren.
- Eine Obergrenze. Nach N Versuchen geht die Nachricht in eine eigene Warteschlange, und jemand sieht sie sich an. Ewig zu wiederholen heißt, das Problem zu verstecken.
- Wissen, was wiederholt wird. Ein 503 wird wiederholt. Ein 400 nicht: Die Anfrage ist falsch und bleibt es. Einen 400 zu wiederholen heißt, Ressourcen auszugeben, um später zu scheitern.
2. Idempotenz: wiederholen können, ohne etwas kaputt zu machen
Wenn der vorige Punkt Sie wiederholen lässt, muss Wiederholen harmlos sein. Das heißt Idempotenz und ist das Stück, das am häufigsten übersprungen wird.
Praktisch heißt das: Jede Operation trägt einen eigenen, stabilen Schlüssel, abgeleitet aus den Daten und nicht aus dem Zeitpunkt. Die Rechnungsnummer taugt. Eine UUID, die vor dem Senden erzeugt wird, auch. Date.now() nicht, weil es sich bei jedem Versuch ändert.
Der Empfänger merkt sich diese Schlüssel und gibt bei einer Wiederholung das vorige Ergebnis zurück, statt etwas Neues anzulegen. Ist der Empfänger ein fremdes System, das nichts davon tut, machen Sie es selbst: Vor dem Anlegen fragen Sie, ob es schon existiert. Das ist ein Aufruf mehr und erspart Ihnen das Duplikat.
Eine idempotente Integration lässt sich nach einem Ausfall komplett neu durchlaufen. Eine, die es nicht ist, fasst niemand ohne Angst an — und die Angst ist der Grund, warum sie niemand repariert.
3. Nachvollziehbarkeit: “Was ist mit Auftrag 4412 passiert?” beantworten können
Diese Frage wird Ihnen das Verhältnis zum Kunden retten.
Jede Nachricht trägt eine Korrelations-ID, die von einem Ende zum anderen mitläuft und in jeder Protokollzeile auftaucht. Fragt jemand nach einem Auftrag, suchen Sie diese ID und sehen die ganze Geschichte: wann er hereinkam, wie viele Versuche es gab, was die Gegenseite zurückgab, wann er angenommen wurde.
Ohne das lautet die ehrliche Antwort auf “Was ist mit 4412 passiert?” schlicht “Ich weiß es nicht”, und diese Antwort kostet mehr als die gesamte Entwicklung.
Zwei Details zählen: Heben Sie Anfrage- und Antwortinhalt zumindest eine Weile auf, denn “es kam ein Fehler” nützt ohne die Meldung nichts. Und speichern Sie keine personenbezogenen Daten, die Sie nicht brauchen, denn auch Protokolle sind ein Ort, an dem Dinge nach außen gelangen.
Das Minimum, um ruhig zu schlafen
Wenn Sie zwei Systeme verbinden wollen und wenig Zeit haben, ist das die Reihenfolge:
- Ein Idempotenzschlüssel bei jeder Operation.
- Wiederholungen mit Backoff und eine Warteschlange für Fehlgeschlagenes.
- Eine Korrelations-ID in allen Protokollzeilen.
- Eine Meldung, sobald diese Warteschlange nicht mehr leer ist.
Vier Dinge, in Tagen statt Monaten erledigt, und sie sind der Unterschied zwischen einer Integration, bei der Sie schlafen können, und einer, bei der Sie montags Tabellen durchsehen.
Alles Weitere — Übersichten, Kennzahlen, automatische Wiederverarbeitung — kommt danach und entsteht nur, wenn diese vier da sind.