NCA Social Media
Aktualisiert:
Autor:
Roland Golla
Grüne Balkenwaage Parallel Run mit grauem und grünem Würfel im Gleichgewicht

Parallel Run: Definition

Beim Parallel Run laufen alte und neue Implementierung gleichzeitig über dieselben Eingaben. Der Nutzer bekommt weiterhin das Ergebnis des Altsystems, das neue Ergebnis wird nur mitgerechnet und protokolliert. Erst wenn beide über einen längeren Zeitraum übereinstimmen, wird umgeschaltet.

Das Verfahren ist unter mehreren Namen bekannt: Shadow Run, Shadow Testing, Dark Launch oder Parallel Run. Gemeint ist immer dasselbe. Es eignet sich überall dort, wo Logik deterministische Ergebnisse liefert, etwa bei Preisberechnungen, Rabattlogik, Scoring oder Berechtigungsprüfungen. Tests können hier nur das abdecken, woran jemand gedacht hat. Der Parallel Run prüft dagegen gegen echten Produktionsverkehr mit allen Datenkonstellationen, die im Laufe der Jahre entstanden sind.

Parallel Run mit NCA: Schnelle Hilfe vom Experten

Kritische Geschäftslogik abzulösen ist die heikelste Aufgabe in jedem Modernisierungsprojekt. Never Code Alone arbeitet seit über 20 Jahren an genau solchen Stellen: Preisrechner, Abrechnungslogik, Berechtigungen. Unser Stack aus Symfony, PHPUnit und Cypress läuft täglich in Produktion, das Monitoring über Sentry und Grafana gehört selbstverständlich dazu.

Wir begleiten Teams im PHP Consulting und beim Refactoring Workshop. Für die Absicherung davor und danach nutzen wir PHPUnit, Functional Tests und Cypress. Die Struktur des Bestands prüfen PHPStan und Deptrac, Hotspots findet Churn PHP.

Lass uns sprechen

Finde das passende Angebot für dein Projekt

Anfrage-Konfiguration

Starten Sie Ihre Anfrage

Projektart
Infos
Nachricht

Eliminierung technischer Schulden mit PHPStan, Rector PHP und PHPUnit. Über 20 Jahre Praxiserfahrung in skalierbaren Backends.

CORE EXPERTISE

Gesetzliche Konformität & Inklusion. Optimierung von Performance und Conversion durch radikal nutzerzentriertes, universelles Design.

BFSG COMPLIANT

Skalierbare KI-Systeme mit echtem Code Ownership. CI/CD, Backup-Strategien und Infrastruktur, die mit deinem Team wächst.

ENTERPRISE READY

Warum Tests hier nicht ausreichen

Eine Preisberechnung, die seit zwölf Jahren läuft, kennt Fälle, an die niemand mehr denkt. Verträge aus einer alten Tarifgeneration, Rundungsregeln für eine bestimmte Währung, ein Sonderfall für einen einzelnen Großkunden, der einmal ins System gewandert ist.

Tests decken das ab, woran jemand gedacht hat. Genau deshalb sind sie beim Ablösen kritischer Logik notwendig, aber nicht ausreichend. Der Produktionsverkehr enthält Konstellationen, die kein Team vollständig rekonstruieren kann.

Der Parallel Run nutzt genau diesen Verkehr. Jede echte Anfrage wird zusätzlich durch die neue Implementierung geschickt. Weicht das Ergebnis ab, entsteht ein Eintrag im Log, nicht ein Fehler beim Kunden. Nach einigen Wochen liegt eine Liste aller Fälle vor, in denen alt und neu sich unterscheiden. Diese Liste ist die vollständigste Anforderungsbeschreibung, die das Team je hatte.

Aufbau in PHP

Die einfachste Form ist ein Dekorator um die bestehende Berechnung. Er ruft das Original auf, gibt dessen Ergebnis zurück und rechnet die neue Variante nur nebenbei mit.

Code:
          

final class ComparingCalculator implements Calculator
{
    public function calculate(Order $order): Amount
    {
        $current = $this->legacy->calculate($order);

        if (!$this->toggles->isEnabled('calculator_comparison')) {
            return $current;
        }

        try {
            $candidate = $this->rewrite->calculate($order);

            if (!$current->equals($candidate)) {
                $this->log->mismatch($order, $current, $candidate);
            }
        } catch (Throwable $error) {
            $this->log->shadowFailure($order, $error);
        }

        return $current;
    }
}

Drei Details entscheiden über den Erfolg. Der Schattenpfad darf niemals das Nutzerergebnis beeinflussen, deshalb steckt er komplett in einem try Block. Ein Feature Flag steuert, ob und für welchen Anteil des Verkehrs verglichen wird. Und die Rückgabe bleibt bis zum Ende das alte Ergebnis.

Bei aufwendigen Berechnungen sollte der Vergleich asynchron laufen, etwa über Symfony Messenger. Sonst zahlt jeder Nutzer die doppelte Rechenzeit. Alternativ genügt oft eine Stichprobe von fünf bis zehn Prozent, um belastbare Aussagen zu bekommen.

Abweichungen bewerten statt zählen

Ein Vergleich ohne definierte Toleranz erzeugt nur Rauschen. Bevor der erste Schattenlauf startet, muss geklärt sein, was Gleichheit überhaupt bedeutet. Bei Geldbeträgen ist das eine Frage der Rundung, bei Listen eine Frage der Reihenfolge, bei Zeitstempeln eine Frage der Genauigkeit.

Ebenso wichtig ist die Abbruchbedingung. Wann gilt die neue Implementierung als reif? Eine brauchbare Regel lautet: keine unerklärte Abweichung über einen vollen Geschäftszyklus, also inklusive Monatswechsel, Abrechnungslauf und Saisonspitze. Wer nach drei ruhigen Tagen umschaltet, hat den Zweck verfehlt.

Jede protokollierte Abweichung braucht genug Kontext, um sie später nachzuvollziehen: die Eingabedaten in gehashter oder anonymisierter Form, beide Ergebnisse, die Version beider Implementierungen und einen Trace der Anfrage. Ohne diese Angaben ist ein Eintrag im Log wertlos.

Die vier Phasen eines Parallel Run

Phase Was läuft Was der Nutzer sieht
Vorbereitung Nur die alte Logik, Vergleich ist abgeschaltet Altes Ergebnis
Schattenlauf Beide Implementierungen, Stichprobe von fünf bis zehn Prozent Altes Ergebnis
Vollvergleich Beide Implementierungen über den gesamten Verkehr Altes Ergebnis
Umschaltung Neue Logik führt, alte bleibt als Rückfallebene Neues Ergebnis

Kosten, Risiken und Datenschutz

Ein Parallel Run ist nicht umsonst. Die Rechenlast verdoppelt sich für den verglichenen Anteil des Verkehrs. Deshalb startet man klein und erhöht die Quote, wenn die Zahlen stabil aussehen.

Der zweite Preis ist doppelte Pflege. Solange beide Implementierungen laufen, muss jede fachliche Änderung an beiden Stellen ankommen. Das ist der stärkste Grund, die Vergleichsphase nicht endlos auszudehnen. Ein Parallel Run, der seit einem Jahr läuft, ist kein Sicherheitsnetz mehr, sondern doppelte Wartung.

Drittens muss der Schattenpfad hart isoliert sein. Timeouts, Circuit Breaker und ein umschließendes try sind Pflicht. Wenn die neue Implementierung in eine Endlosschleife läuft, darf das den Nutzer nicht erreichen. Besondere Vorsicht gilt bei Schreibzugriffen: Der Schattenpfad darf keine Mails verschicken, keine Zahlungen auslösen und nichts in fremde Systeme schreiben. Solche Nebenwirkungen werden für den Vergleich abgeschaltet.

Beim Protokollieren gilt Datensparsamkeit. Ein Abweichungslog enthält schnell personenbezogene Daten, weil es die Eingaben mitschreibt. Für die Analyse reicht in aller Regel ein Hash der Eingabe plus die beiden Ergebnisse. Wer echte Daten braucht, klärt Zweck, Speicherdauer und Zugriff vorher, statt im Nachhinein.

Wird KI zur Analyse der Abweichungen eingesetzt, gilt dieselbe Regel wie überall bei uns: Modelle, die nicht auf eigener Infrastruktur laufen, sehen keine Produktionsdaten. Analysen laufen gegen anonymisierte Auszüge oder Fake Daten in der lokalen Entwicklungsumgebung.

A Ruby library for carefully refactoring critical paths.

– GitHub Scientist, README auf GitHub

Die NCA Erfahrung mit kritischer Geschäftslogik

Je wichtiger eine Berechnung für das Geschäft ist, desto weniger Lust hat jemand, sie anzufassen. Genau dort lohnt sich der Aufwand für einen sauberen Vergleich am meisten.

Die Absicherung davor läuft über PHPUnit und Functional Tests, wie belastbar die Suite ist zeigt Infection. Für die Struktur sorgen PHPStan, Psalm und Deptrac, automatisierte Umbauten übernimmt Rector PHP. Wo die Rechenzeit hingeht, zeigen SPX und der Flame Graph mit Xdebug. Über die Oberfläche prüft Cypress, dass sich fachlich nichts verschoben hat. Bei Schemaänderungen im Zuge der Umstellung helfen Doctrine Migrations.

CYPRESS.IO Ambassador und IT Consultant für QA Engenieering und Qualität in PHP Projekten.

Erreichen Sie unsere PHP Consultant Spezialisten

Wir sind Experten für PHP und helfen Ihnen, Ihre digitalen Herausforderungen zu meistern. Unser erfahrenes Team unterstützt Sie bei PHP Updates, PHP Refactoring und berät Sie remote zu allen Fragen rund um PHP. Mit unseren vollautomatischen CI/CD Deployments und einer robusten Docker-Infrastruktur bringen wir Ihre PHP-Projekte auf das nächste Level. Vertrauen Sie auf unsere Expertise für zuverlässige und skalierbare PHP-Lösungen.

Häufige Fragen zum Parallel Run

Was Teams wissen wollen, bevor sie kritische Logik ablösen.

Was ist ein Parallel Run 2026 kurz erklärt?

Alte und neue Implementierung rechnen dieselbe Anfrage gleichzeitig. Der Nutzer bekommt weiterhin das alte Ergebnis, das neue wird nur protokolliert und verglichen. Erst wenn beide über einen längeren Zeitraum übereinstimmen, übernimmt die neue Logik. Damit lässt sich gegen echten Produktionsverkehr prüfen statt nur gegen ausgedachte Testfälle.

Heißt das 2026 auch Shadow Testing oder Dark Launch?

Ja, die Begriffe meinen im Kern dasselbe. Shadow Run und Shadow Testing betonen, dass der neue Pfad im Verborgenen läuft. Dark Launch wird häufiger für ganze Features verwendet. Martin Fowlers Parallel Model beschreibt dagegen etwas anderes, nämlich alternative Systemzustände über Event Sourcing, und sollte nicht damit verwechselt werden.

Wann lohnt sich der Aufwand 2026?

Bei deterministischer Logik mit hohem Geschäftsrisiko, etwa Preisberechnung, Rabatte, Scoring, Abrechnung oder Berechtigungen. Bei einfachem CRUD ohne Rechenlogik gibt es nichts zu vergleichen, dort genügen Tests. Faustregel: Wenn eine falsche Zahl Geld oder Vertrauen kostet, ist der Vergleich sein Geld wert.

Wie lange soll die Vergleichsphase 2026 laufen?

Mindestens einen vollständigen Geschäftszyklus, also über Monatswechsel, Abrechnungslauf und Saisonspitze hinweg. Wer nach ein paar ruhigen Tagen umschaltet, hat die interessanten Fälle nicht gesehen. Gleichzeitig sollte die Phase nicht endlos dauern, weil währenddessen zwei Implementierungen gepflegt werden müssen.

Verdoppelt sich 2026 die Serverlast?

Für den verglichenen Anteil des Verkehrs ja. Deshalb startet man mit einer Stichprobe von fünf bis zehn Prozent und erhöht schrittweise. Bei teuren Berechnungen lässt sich der Schattenpfad zusätzlich asynchron über eine Queue ausführen, dann wartet der Nutzer nicht auf das Vergleichsergebnis.

Was ist mit Schreibzugriffen und Nebenwirkungen?

Der Schattenpfad darf keine auslösen. Keine Mails, keine Zahlungen, keine Aufrufe in fremde Systeme. Solche Stellen werden für den Vergleich abgeschaltet oder gegen Testdoubles getauscht. Wenn sich Nebenwirkungen nicht trennen lassen, ist der Parallel Run für diese Stelle das falsche Werkzeug.

Wie definiere ich, wann zwei Ergebnisse gleich sind?

Vor dem ersten Lauf und gemeinsam mit dem Fachbereich. Bei Geldbeträgen geht es um Rundung, bei Listen um Reihenfolge, bei Zeitstempeln um Genauigkeit. Ohne diese Absprache produziert der Vergleich hunderte Meldungen, die niemand einordnen kann, und wird nach zwei Wochen ignoriert.

Was gehört in ein Abweichungsprotokoll?

Ein Kennzeichen der Eingabe, beide Ergebnisse, die Version beider Implementierungen, ein Zeitstempel und eine Trace ID zur Anfrage. Personenbezogene Daten gehören nur hinein, wenn es unvermeidbar ist, und dann mit geklärter Speicherdauer. Für die meisten Analysen reicht ein Hash der Eingabe völlig aus.

Brauche ich dafür ein spezielles Framework?

Nein. Ein Dekorator um die bestehende Schnittstelle, ein Feature Flag und ein Logger genügen. Als Vorbild dient GitHubs Scientist, das es in Portierungen für viele Sprachen gibt. In PHP lässt sich das Muster aber in wenigen Zeilen selbst bauen und passt dann genau zur eigenen Definition von Gleichheit.

Wie verhält sich der Parallel Run zum Strangler Fig Pattern?

Sie greifen ineinander. Strangler Fig verschiebt eine Route auf das neue System. Der Parallel Run prüft vorher, ob die neue Implementierung dieselben Ergebnisse liefert. In der Praxis läuft der Vergleich, solange die Route noch auf dem Altsystem liegt, und das Umschalten ist dann eine Formalität.

Was passiert nach der Umschaltung mit dem alten Code?

Er bleibt zunächst als Rückfallebene erhalten, aber nur für einen vorher festgelegten Zeitraum. Danach wird er entfernt. Wer diesen Rückbau nicht einplant, hat dauerhaft zwei Implementierungen und damit genau die doppelte Wartung, die das Verfahren eigentlich nur vorübergehend rechtfertigt.

Wie unterstützt Never Code Alone dabei?

Wir helfen beim Zuschnitt der Vergleichsstelle, bei der Definition von Gleichheit und Toleranzen und beim Aufbau der Auswertung. Vorher sorgen wir dafür, dass die Quality Gates stehen. Am Anfang steht ein kostenloses Kennenlernen, danach schätzen wir den Aufwand und rechnen transparent nach Minuten ab.