rp-dag
Zweck
Verantwortet die Workflow-Trigger und das Ausführungsprotokoll. Führt selbst nichts aus.
Verantwortungsgrenze
Hierher gehören genau zwei Dinge und nichts anderes:
- Trigger — „wenn dieses Bus-Thema erscheint, führe jenen Workflow aus“. Systemkonfiguration: Dutzende von Zeilen, die ein Operator pflegt und die vollständig im Speicher der Laufzeit gehalten werden, statt abgefragt zu werden.
- Das Ausführungsprotokoll — ein Baum dessen, was ein Lauf getan hat. Die Laufzeit schreibt ihn, während das Skript läuft: Ein Knoten wird geöffnet, bevor sein Inhalt ausgeführt wird, und geschlossen, wenn er fertig ist, sodass ein laufender Lauf den Knoten zeigt, bei dem er gerade steht.
Der Workflow-Katalog wird hier nicht verwaltet. Ptah legt die Deskriptoren der aktiven Solution in die Umgebung dieses Dienstes (, WORKFLOWS, WORKFLOW_DIGESTS) und MODULE_PROXY veröffentlicht sie für die Laufzeit und die UI erneut. Die Quelldaten bleiben hinter Ptah-proxy.listAvailableWorkflows
Das Protokoll wird von der Laufzeit geschrieben, nicht von diesem Dienst
Nichts hier schreibt einen Protokolleintrag. Die Laufzeit formatiert ihn, legt ihn unter einem selbst zusammengesetzten Schlüssel in Valkey ab und übergibt später die Schlüssel — niemals die Einträge. wandelt jeden Schlüssel in einen Speicherort um und weist den Speicher an, den Eintrag abzuholen; der Speicher liest den Cache direkt, sodass ein Eintrag den Transport genau einmal durchquert, als Bytes, die niemand erneut kodiert.commitLog
Workflow-Thread ─► Warteschlange ─► Protokollschreiber ─► Valkey
│
└─ commitLog([keys]) ─► rp-dag ─► Speicher liest Valkey
│
◄──── übernommen ──────────────────────────┘
└─ die übernommenen Schlüssel löschen
Das hält die Protokollierung vom kritischen Pfad des Workflows fern: Ein Knoten kostet die Laufzeit einen Eintrag in die Warteschlange und sonst nichts. Es bedeutet außerdem, dass das Protokoll konstruktionsbedingt nach bestem Bemühen geführt wird — ein Eintrag kann bei Rückstau verloren gehen, und ein Stapel kann nach einem Absturz zweimal übernommen werden. Schlüssel werden aus dem Lauf und der Sequenz des Knotens abgeleitet, sodass die zweite Übernahme eine Überschreibung statt eines Duplikats ist.
Aus diesem Grund kommen die Schlüssel von der Laufzeit: Eine von diesem Dienst vergebene Nummer würde pro Knoten eine Hin- und Rückfahrt kosten und wäre nach einem Neustart nicht reproduzierbar.
— der Laufdag:log:<executionId>:exec— einer seiner Knoten, auf sechs Stellen mit Nullen aufgefülltdag:log:<executionId>:n:<seq>
leitet den Speicherort aus dem Schlüssel ab und lehnt alles außerhalb des Präfixes commitLog ab, sodass ein Schlüssel die gesamte Autorität darstellt, die der Aufruf mit sich führt.dag:log:
Das Protokoll ist ein Baum
exec:<id> der Lauf
node:<id>:<seq> seine Knoten in der Reihenfolge, in der sie geöffnet wurden
Ein Knoten, der über delegiert hat, enthält die ID des untergeordneten Laufs, und das untergeordnete Element ist ein gewöhnlicher Lauf mit eigenen Knoten. rt.sub folgt diesem Verweis in Tiefensuche und gibt das Ergebnis flach zurück, wobei jede Zeile mit ihrer executionTree gekennzeichnet ist — ein Client stellt den Baum dar, indem er nur einrückt. Ein übergeordneter Index ist nicht erforderlich: Der Verweis ist der Knoten, der ihn erstellt hat.depth
Sequenzen werden im Schlüssel mit Nullen aufgefüllt, weil der KV-Speicher einen Präfixbereich in lexikografischer Reihenfolge zurückgibt und diese Reihenfolge der Reihenfolge entsprechen muss, in der die Knoten ausgeführt wurden. Die Laufzeit füllt beim Zusammensetzen des Cache-Schlüssels auf dieselbe Breite auf; die beiden Breiten sind ein Vertrag.
Die Aufbewahrung ist auf Läufe begrenzt ( standardmäßig) und wird bei jedem hundertsten Öffnen durchgesetzt. Das Protokoll dient der Diagnose, nicht der Archivierung.5000
Trigger-Änderungen erreichen die Laufzeit über den Bus
Beim Erstellen, Ändern oder Löschen eines Triggers wird veröffentlicht. Die Laufzeit abonniert dieses Thema zusätzlich zu den eigenen Themen der Trigger, sodass eine Änderung für das nächste Ereignis aktiv ist, statt ein Abfrageintervall abzuwarten. Die Veröffentlichung erfolgt nach bestem Bemühen — ein ausgefallener Bus darf die Änderung durch einen Operator nicht fehlschlagen lassen — und die regelmäßige Aktualisierung der Laufzeit bleibt die Rückfallebene.dag.triggers.changed
Direkte Modulabhängigkeiten
- g-bus — um eine Trigger-Änderung anzukündigen
Solution-Zugehörigkeit
- Nicht in einer vordefinierten Solution enthalten
Quelle
modules/repositories/automation/rp-dag