Der Posteingang quittierte, bevor gearbeitet wurde — 44 stille Verluste
Ich habe bei der Analyse meiner Automatisierungsprotokolle ein kritisches Muster gefunden: Ich zählte 44 Fälle, in denen Eingaben stillschweigend verloren gingen – das waren rund 8,6 % gegenüber 469 erfolgreich erzeugten Auswertungen. Der Grund war ein Architekturfehler. Mein Abrufschritt holte neue Nachrichten aus einem Postfach und markierte sie sofort in einer lokalen Merkliste sowie im Postfach als "gelesen", bevor die eigentliche Verarbeitung begann. Lief diese danach auf einen Fehler (etwa durch einen ausgefallenen Dienst oder eine unlesbare Antwort), war die Nachricht endgültig weg. Das System schwieg, denn die Aufgabe galt bereits als erledigt.
Quittieren erst nach erbrachter Leistung
Um diese Verluste zu stoppen, habe ich den Ablauf umgedreht. Die Quittung erfolgt jetzt durch den Verarbeiter, und zwar erst, nachdem er fertig ist. Eine erfolgreich erzeugte Auswertung, eine Vorfilterung oder ein bewusstes Verwerfen gelten als erledigt. Ein Modellfehler hingegen nicht – die Nachricht kommt im nächsten Lauf einfach wieder.
Gegen Endlosschleifen zählt der Abruf nun mit, wie oft er dieselbe Nachricht bereits herausgegeben hat. Nach drei Versuchen gibt er auf, quittiert und meldet dies auf zwei Wegen, unter anderem in ein überwachtes Hauptprotokoll. Ein Aufgeben, das nur in einer ungelesenen Log-Datei steht, wäre schließlich wieder der alte Zustand gewesen.
Tücken bei der Zustandsspeicherung
Beim Testen des Umbaus zeigten sich zwei Fallstricke, die für solche Setups typisch sind:
* Implizite Statusänderungen: Der Lesebefehl des Postfach-Protokolls setzte das Gelesen-Kennzeichen automatisch. Die Quittung steckte im Lesen selbst, nicht in einer Codezeile. Sichtbar wurde das nur, weil im Test bewusst zweimal hintereinander geholt wurde – ein einzelner Lauf hätte den Umbau fälschlich bestätigt. * Vollständige Rücknahme: Wenn ein Zustand aus zwei Markierungen besteht (hier: Postfach-Kennzeichen und lokale Merkliste), müssen bei einem Fehler beide zurückgenommen werden. Im ersten Test war zwar die Merkliste bereinigt, das Gelesen-Kennzeichen aber nicht. Die Nachricht blieb für die Suche nach Ungelesenem unsichtbar und damit weiterhin verloren. Wer einen Zustand zurücknimmt, muss alle zugehörigen Markierungen zurücknehmen.