So lösen Sie einen Service sicher aus einem Monolithen
So lösen Sie einen Service aus einem Monolithen: mit unabhängigen Daten, begrenztem Deployment-Risiko und einem Rollback per Routingwechsel.

Der erste herausgelöste Service sollte beweisen, dass der Monolith Verantwortung abgeben kann, ohne die Kontrolle zu verlieren. Wählen Sie ihn nach Datenhoheit und Deployment-Risiko aus, nicht danach, wie ordentlich sich ein Kasten um ein Modul zeichnen lässt. Ein sauberes Package mit gemeinsam genutzten Tabellen, synchronen Aufrufern und einer großen Transaktion bleibt in jeder wichtigen Hinsicht Teil des Monolithen.
Ich habe Teams erlebt, die den scheinbar am besten isolierten Code herauslösten, das aufgeräumte Repository feierten und dann feststellten, dass jedes Release eine koordinierte Datenbankänderung und einen nächtlichen Anruf bei drei Verantwortlichen brauchte. Der Service existierte als Prozess, aber nicht als betriebliche Einheit. Beim ersten echten Produktionsfehler wanderte er direkt zurück in den Monolithen.
Eine gute erste Extraktion hat eine schmale Schreibfläche, Daten mit einem eindeutigen Besitzer, Aufrufer, die eine Netzwerkgrenze vertragen, und einen Release-Pfad, der sich ohne manuelle Datenreparatur umkehren lässt. Im Architekturdiagramm kann das langweilig aussehen. Langweilig ist nützlich, wenn das Team gerade lernt, wie sich sein System tatsächlich verhält.
Beginnen Sie mit Datenhoheit, nicht mit einem Fachbegriff
Der beste erste Service besitzt eine zusammenhängende Menge an Fakten und kann Schreibvorgänge ablehnen, ohne den halben Monolithen zu befragen. Dieses Kriterium ist strenger als Klassen namens Billing, Customer oder Inventory. Ein Fachbegriff umfasst oft Abläufe, Berichte, Berechtigungen und historische Tabellen, die verschiedene Codepfade aus unterschiedlichen Gründen verändern.
Fragen Sie, welche Komponente zur einzigen Autorität für eine kleine Gruppe von Datensätzen werden kann. Hoheit bedeutet: Sie prüft Änderungen, schreibt sie fest, vergibt Kennungen und veröffentlicht das Ergebnis. Anderer Code darf diese Fakten zwischenspeichern oder kopieren, aber nicht mehr die maßgeblichen Zeilen bearbeiten. Wenn Monolith und neuer Service beide gültige Schreiber bleiben, haben Sie statt einer Grenze ein verteiltes Rennen gebaut.
Verfolgen Sie Schreibvorgänge vor Lesevorgängen. Lesezugriffe lassen sich meist leichter duplizieren, cachen oder über eine Kompatibilitätsansicht bedienen. Schreibvorgänge legen die Regeln offen, die Daten gültig halten. Durchsuchen Sie Anwendungscode, Stored Procedures, geplante Jobs, Datenbank-Trigger, Importskripte, Support-Werkzeuge und direkte Operator-Befehle. Altsysteme verstecken entscheidende Schreibvorgänge oft dort, wo das Haupt-Repository sie nicht sichtbar macht.
Ein geeigneter Kandidat könnte Aufträge zur Dokumenterzeugung, Benachrichtigungseinstellungen, Wechselkurs-Snapshots oder abgeschlossene Exportjobs besitzen. Solche Beispiele haben einen begrenzten Zustandsübergang und vertragen oft asynchrone Arbeit. Schlechte Kandidaten heißen meist Kunde, Auftrag, Konto oder Berechtigung, wenn diese Datensätze in jeder wichtigen Transaktion liegen. Diese Domänen können später Services werden. Wer mit ihnen beginnt, lässt die Migration jedoch die schwerste Lektion zum höchsten Preis erteilen.
Verwechseln Sie eine Tabellengruppe nicht mit einer Domäne. Hat eine Tabelle zwölf eingehende Fremdschlüssel, zwei Trigger, die andere Aggregate aktualisieren, und einen nächtlichen Korrekturjob, schafft ihr Umzug keine Unabhängigkeit. Er verschiebt nur das Zentrum eines Abhängigkeitsnetzes. Die PostgreSQL-Dokumentation beschreibt Fremdschlüssel als Abhängigkeiten zwischen referenzierenden und referenzierten Zeilen. Diese Garantie gilt lokal innerhalb der Datenbanktransaktion. Sobald Tabellen hinter getrennten Services liegen, muss die Anwendung sie bewusst ersetzen oder schwächere Konsistenz akzeptieren.
Messen Sie Kopplung mit Laufzeitdaten
Statische Abhängigkeitsgraphen sind ein Anfang, doch Produktionsdaten zeigen, ob ein Kandidat eine Prozessgrenze übersteht. Instrumentieren Sie den Monolithen lange genug, um Aufrufer, Query-Formen, Schreibhäufigkeit, Transaktionsdauer, Payload-Größe, Latenzempfindlichkeit, Retry-Verhalten und Lastspitzen zu sehen. Die wichtige Einheit ist keine Quelldatei, sondern eine Anfrage oder ein Job, der die geplante Grenze überschreitet.
Erstellen Sie ein Kandidatenregister mit einer Zeile pro vorgeschlagenem Service. Erfassen Sie gelesene und geschriebene Tabellen, jeden Aufrufer, ob ein Aufruf in einer Benutzeranfrage liegt, ob ein Fehler warten darf und welche Invarianten heute eine gemeinsame Datenbanktransaktion voraussetzen. Ergänzen Sie den Deployment-Verantwortlichen und die Rollback-Aktion. Steht in einem dieser Felder „noch festzulegen“, ist der Kandidat nicht bereit.
Eine Repository-Suche übersieht dynamisches SQL, Reflection, generierte Abfragen und außerhalb des Repositorys ausgerollten Code. Datenbank-Statement-Logs und Traces erfassen diese Pfade. Beobachten Sie lange genug, um geplante Arbeiten wie Abrechnung, Fakturierung, Abstimmung, Archivierung und Monatsabschluss einzuschließen. Der ruhige Endpunkt vom Dienstag kann am letzten Geschäftstag des Monats das Zentrum des Systems sein.
Zählen Sie grenzüberschreitende Operationen statt Methodenaufrufe. Eine gesprächige Repository-Methode kann zwanzig Abfragen ausführen, aber zusammen mit ihren Daten sauber umziehen. Ein harmloser Getter kann Teil einer Transaktion sein, die Zeilen in vier Domänen sperrt. Die PostgreSQL-Dokumentation zu expliziten Sperren erklärt, dass SELECT FOR UPDATE konkurrierende Aktualisierungen und Sperranfragen bis zum Transaktionsende blockiert. Ersetzen Sie dieses lokale Warten durch einen Fernaufruf, ändern sich Timing, Fehlerarten und Deadlock-Verhalten, selbst wenn die zurückgegebenen Felder gleich bleiben.
Behandeln Sie unbekannten Traffic als Risiko, nicht als null. Wenn Logs nicht zeigen, wer eine Tabelle aktualisiert, schaffen Sie vor der Extraktion Sichtbarkeit. Ein Proxy, ein vorübergehend eingesetzter Audit-Trigger oder ein Trace-Tag in der Datenzugriffsschicht kann den Schreiber offenlegen. Raten ist nur so lange schneller, bis der unbekannte Schreiber den Zustand des neuen Service überschreibt.
Die Belege sollten vier unbequeme Fragen beantworten: Darf der Service ausfallen, ohne die Haupttransaktion zu blockieren? Kann ein Aufrufer wiederholen, ohne Arbeit zu duplizieren? Kann ein Operator erklären, welche Kopie eines Datensatzes maßgeblich ist? Kann das Team die Route abschalten, während beide Speicher intern konsistent bleiben? Ein erster Service braucht nicht vier perfekte Antworten, aber jede schwache Antwort braucht eine getestete Kontrolle.
Ein sauberes Diagramm kann einen schlechten Schnitt verbergen
Verwerfen Sie Kandidaten, deren Reiz hauptsächlich aus organisatorischer Ordnung stammt. Teams wählen oft ein Modul, weil bereits ein Team dafür zuständig ist, sein Namespace ordentlich wirkt oder ein Herstellerdiagramm es als Bounded Context bezeichnet. Nichts davon beweist, dass sich der Code allein deployen lässt.
Authentifizierung ist eine häufige Falle. Sie wirkt horizontal und abgeschlossen, doch jede Anfrage hängt von ihrer Latenz und Verfügbarkeit ab. Ihre Daten können außerdem Zugangsdaten, Sitzungen, Rollen, Mandantenzugehörigkeit, Audit-Historie und Wiederherstellungsabläufe mischen. Eine Authentifizierungsextraktion kann sinnvoll sein, ist aber eine schlechte Generalprobe, wenn ein Routingfehler das ganze Unternehmen aussperrt.
Gemeinsame Referenzdaten bilden eine weitere Falle. Ein Modul für Ländercodes oder Produktkategorien wirkt schreibgeschützt, bis Administratoren es ändern, Caches zu verschiedenen Zeiten aktualisiert werden und Fachregeln erwarten, dass eine Änderung in derselben Transaktion greift. Das Volumen ist klein, der Fan-out jedoch gewaltig. Wenig Traffic bedeutet kein geringes Deployment-Risiko.
Reporting-Code erscheint sicherer, weil Berichte selten Kerndatensätze verändern. Versteckt sind die Abhängigkeiten der Abfragen. Ein Bericht, der dreißig Monolith-Tabellen verbindet, wird nicht unabhängig, wenn ein HTTP-Endpunkt dasselbe SQL kapselt. Er wird zu einem entfernten Query-Service, der an jedem gelesenen Schema hängt. Eine Reporting-Projektion lässt sich herauslösen, nachdem ihr Feed definiert ist und Verzögerungen zulässig sind. Die vorhandenen Joins herauszulösen fügt nur einen Netzwerk-Hop hinzu.
Ich widerspreche der Empfehlung „zuerst das einfachste Modul herauslösen“. Sie ist beliebt, weil ein schneller Repository-Split sichtbaren Fortschritt und eine neue Deployment-Pipeline erzeugt. Sie ist falsch, wenn „einfach“ nur die Codebewegung meint. Wählen Sie die Verantwortung, die sich am leichtesten eigenständig betreiben lässt, einschließlich Daten, Fehlern, Deployment, Beobachtung und Umkehr. Diese Definition erzeugt weniger Theater und mehr Erkenntnis.
Deployment-Risiko ist wichtiger als Servicegröße
Ein kleiner Service kann einen riesigen Schadensradius haben, während ein größerer asynchroner Worker still ausfällt und seine Queue später abarbeitet. Ordnen Sie die erste Extraktion danach, was bei einem schlechten Release geschieht. Codeumfang taugt wenig als Ersatzmaß. Der Anteil kritischer Anfragen, der die Grenze überschreitet, sagt deutlich mehr.
Bevorzugen Sie einen Kandidaten außerhalb des synchronen Pfads für Anmeldung, Checkout, Autorisierung oder die primäre Datensatzänderung. Benachrichtigungsversand, Dateikonvertierung, Exporterzeugung und Dokumentindexierung eignen sich oft besser, weil der Monolith Arbeit einstellen und fortfahren kann. Das macht sie nicht unwichtig. Es gibt dem Team Zeit zum Beobachten, Wiederholen und Reparieren, ohne jeden Servicefehler in einen Gesamtausfall zu verwandeln.
Prüfen Sie auch Ressourcenkopplung. Ein neuer Prozess kann dieselbe Datenbank mit einem anderen Connection Pool überlasten, langsame Abfragen aggressiver wiederholen oder eine gemeinsame Queue erschöpfen. Trennung im Deployment-Diagramm trennt weder CPU noch Sperren, Verbindungen oder nachgelagerte Kontingente. Begrenzen Sie Nebenläufigkeit und Wiederholungen ausdrücklich, bevor Sie Produktionstraffic verschieben.
Bewerten Sie Kandidaten anhand von Folgen, die Betreiber erkennen können:
- Ein zehnminütiger Ausfall ist risikoärmer, wenn Arbeit wartet und nachgeholt wird; scheiternde Kernanfragen sind ein Warnsignal.
- Eine Komponente sollte die maßgeblichen Daten schreiben; mehrere Anwendungen und Jobs sind ein Warnsignal.
- Eine stabile Idempotenzkennung macht Wiederholungen sicherer; blinde Anfragewiederholung ist ein Warnsignal.
- Ein Routen- oder Consumer-Wechsel sollte ein Release umkehren; Datenzusammenführung und Schema-Rollback sind ein Warnsignal.
- Verglichene Ausgaben und Fachmetriken sollten semantische Fehler erkennen; Prozesszustand allein ist ein Warnsignal.
Machen Sie aus der Tabelle keine Scheingenauigkeit. Ein Wert von 17 hebt eine Antwort wie „wir können die fehlenden Schreibvorgänge nicht rekonstruieren“ nicht auf. Nutzen Sie die Tabelle, um Vetobedingungen sichtbar zu machen und eine ausdrückliche Diskussion zu erzwingen. Bei der ersten Extraktion ist nicht umkehrbare Datenabweichung ein Veto. Gleiches gilt für eine Abhängigkeit, die alle Aufrufer im selben Fenster deployen lässt.
Definieren Sie den Vertrag vor dem Umzug der Implementierung
Der Extraktionsvertrag muss das Verhalten bei Wiederholungen, veralteten Eingaben, Duplikaten, Timeouts und Teilfehlern beschreiben. Eine Liste von Endpunkten und Feldern reicht nicht. Aufrufer müssen wissen, welche Anfragekennung stabil bleibt, welcher Zustandsübergang erlaubt ist und welche Antwort bedeutet, dass der Service die Verantwortung dauerhaft übernommen hat.
Schreiben Sie den Vertrag nach dem vorhandenen Verhalten, einschließlich der ungeliebten Teile. Akzeptiert der Monolith doppelte Übermittlungen und liefert den ursprünglichen Job zurück, darf der neue Service nicht plötzlich Konflikte melden, nur weil das sauberer wirkt. Modernisierung folgt auf sichtbare Parität oder geschieht hinter einer ausdrücklich versionierten Änderung. Sonst wird jede Abweichung zum Streit darüber, ob das alte oder neue Ergebnis beabsichtigt war.
Für einen Exportjob-Kandidaten macht eine minimale Anfrage das Retry-Verhalten konkret:
{
"request_id": "01JEXAMPLE8M4Q2",
"account_id": "A1842",
"report_type": "ledger",
"cutoff": "2026-08-01T00:00:00Z"
}
Der Service speichert request_id unter einer eindeutigen Constraint, bevor er die Arbeit beginnt. Eine wiederholte Anfrage liefert den vorhandenen Job und seinen aktuellen Zustand. Ein Timeout nach der Annahme bleibt damit reparierbar: Der Aufrufer wiederholt dieselbe Identität, statt einen weiteren Job anzulegen. Der Vertrag braucht außerdem einen endgültigen Fehlerzustand und eine Regel, ob ein Operator ihn unter derselben Identität erneut versuchen darf.
Beschreiben Sie Fehler durch die nötige Aktion des Aufrufers. „Ungültiger Stichtag, nicht wiederholen“ ist nützlich. „Abhängigkeit nicht verfügbar, mit begrenztem Backoff wiederholen“ ist nützlich. Ein allgemeiner interner Fehler treibt jeden Aufrufer zur gefährlichsten Reaktion, der sofortigen blinden Wiederholung. Legen Sie Anfragegrößen und Fristen im Vertrag fest, sonst entdeckt die größte historische Eingabe diese Grenzen in Produktion.
Halten Sie die erste Schnittstelle kleiner als die alte interne API. Legen Sie Tabellen nicht über allgemeine Endpunkte zum Anlegen, Lesen, Ändern und Löschen offen. Bieten Sie Operationen an, die Invarianten erhalten, etwa request_export, cancel_pending_export und get_export_status. Eine schmale Befehlsfläche erlaubt Änderungen an Implementierungsdetails, ohne erneut jeden Aufrufer zu koordinieren.
Ein Schreiber verhindert Daten im Split Brain
Die Migration braucht einen erklärten Zeitpunkt, ab dem der neue Service als Einziger seine Datensätze schreibt. Doppelte Schreibvorgänge aus dem Anwendungscode sind keine sichere Brücke. Ein Schreibvorgang kann gelingen, während der andere in einen Timeout läuft, und der Aufrufer weiß nicht, ob eine Wiederholung den Zustand repariert oder dupliziert.
Übertragen Sie die Hoheit gestuft. Machen Sie zuerst verborgene Schreiber sichtbar und führen Sie sie durch eine Monolith-Schnittstelle. Führen Sie danach stabile Anfragekennungen ein und zeichnen Sie das alte Verhalten auf. Lassen Sie dann den neuen Service kopierten Traffic verarbeiten, ohne Ergebnisse zu veröffentlichen. Leiten Sie nach bestandenen Paritätsprüfungen maßgebliche Schreibvorgänge zum Service, während der Monolith über einen Kompatibilitätspfad liest. Entfernen Sie den alten Schreiber erst nach Ende des Fallback-Fensters. Das ist eine zusammenhängende Migrationsfolge, keine Sammlung unabhängiger Projekte.
Muss der Monolith auf eine festgeschriebene Änderung reagieren, veröffentlichen Sie ein Ereignis aus derselben Datenbanktransaktion, die die Änderung speichert. Dafür wird üblicherweise eine Transactional Outbox eingesetzt: Der Service schreibt Domänenzustand und Outbox-Zeile gemeinsam fest, danach veröffentlicht ein Relay die Zeile. Consumer müssen weiterhin Duplikate behandeln, weil das Relay nach dem Veröffentlichen, aber vor dem Markieren der Zeile ausfallen kann.
Vermeiden Sie Fremdschlüssel zwischen Services. Sie können Integrität nicht über getrennte Datenbanken erzwingen, und eine gemeinsame Datenbank hält Deployments gekoppelt. Übertragen Sie die referenzierte Kennung, validieren Sie dort, wo der Ablauf es verlangt, und entscheiden Sie über Löschungen oder veraltete Kopien. Manche Invarianten brauchen eine synchrone Prüfung bei der Autorität, andere vertragen eine lokale Projektion. Die Entscheidung gehört in den Domänenvertrag, nicht in einen zufälligen Join.
Ein Daten-Backfill braucht eine Marke und eine Abstimmungsabfrage. „Tabelle kopieren, dann umschalten“ lässt ein Rennen zwischen Snapshot und laufenden Schreibvorgängen offen. Erfassen Sie Änderungen ab einer bekannten Position, laden Sie den Snapshot, wenden Sie Änderungen der Reihe nach an und vergleichen Sie Anzahlen sowie fachliche Summen oder Hashes. Eine gleiche Zeilenanzahl erkennt weder vertauschte Werte und fehlende Beziehungen noch einen Default mit veränderter Bedeutung.
Der Cutover-Plan muss für jede Phase alte und neue Autorität benennen. Muss eine Einsatzleitung die Hoheit aus Dashboards ableiten, während Schreibvorgänge weiterlaufen, ist der Plan schon vor dem Vorfall gescheitert.
Shadow Traffic muss Bedeutung vergleichen
Ein Shadow-Deployment beweist mehr, wenn es fachliche Ergebnisse statt nur Statuscodes vergleicht. Senden Sie eine Kopie geeigneter Produktionsanfragen an den neuen Service, isolieren Sie seine Nebenwirkungen und zeichnen Sie normalisierte Ausgaben beider Implementierungen auf. Klassifizieren Sie danach Unterschiede nach Feld und Fachregel.
Normalisieren Sie nichtdeterministische Werte vor dem Vergleich. Zeitstempel, erzeugte Kennungen, ungeordnete Sammlungen und Formatierung können abweichen, ohne das Verhalten zu ändern. Normalisieren Sie keine bedeutungstragenden Felder weg, etwa Geldrundung, Berechtigungsentscheidungen, zugesicherte Reihenfolgen oder Zeitpunkt eines Zustandswechsels. Jede Normalisierungsregel braucht einen Verantwortlichen und einen Grund.
Aufgezeichneter Produktionstraffic erfasst Kombinationen, die Test-Fixtures verpassen, enthält aber auch sensible Daten und historische Sonderfälle. Definieren Sie Aufbewahrung, Zugriff, Maskierung und Replay-Kontrollen vor der Erfassung. In regulierten Umgebungen kann es wichtiger sein, den Harness innerhalb der Kundengrenze zu halten, als ein gehostetes Testsystem bequem zu nutzen. Die Unterstützung einer solchen Umgebung ist keine Compliance-Zertifizierung. Das sind getrennte Aussagen.
Vergleichen Sie Nebenwirkungen über einen Sink, statt den Shadow-Service echte E-Mails senden, Konten belasten oder maßgebliche Ereignisse veröffentlichen zu lassen. Ersetzen Sie diese Adapter durch Recorder, die die Absicht erfassen. Der nützliche Vergleich lautet „die neue Implementierung hätte dieses Ereignis mit diesen Feldern gesendet“, nicht „der Handler gab 202 zurück“.
Legen Sie Freigabegates um beobachtetes Verhalten. Decken Sie normale Last, größte Payloads, Wiederholungen, ungültige Eingaben, Abhängigkeits-Timeouts und die bei der Kopplungsanalyse gefundenen geplanten Jobs ab. Verlangen Sie null ungeklärte Unterschiede bei Invarianten zu Geld, Berechtigungen oder dauerhaftem Zustand. Dokumentieren Sie bei kosmetischer Formatierung akzeptierte Abweichungen, statt Byte-Gleichheit vorzutäuschen.
CodeHero nutzt beim Umschreiben eines Altsystems einen Parity Harness mit aufgezeichnetem Produktionstraffic. Auf diesen Teil würde ich auch bestehen, wenn ein anderes Team den Ersatz baut. Prozesszustand zeigt, dass der neue Code läuft. Paritätsbelege zeigen, ob er noch dieselbe Aufgabe erfüllt.
Rollback soll Routing ändern, nicht Historie reparieren
Ein sicherer Rollback stoppt neuen Traffic zum herausgelösten Service, ohne dass Operatoren zwei widersprüchliche Historien zusammenführen müssen. Diese Eigenschaft muss vor dem Cutover entstehen. Wenn die Umkehr eine Rücktransformation von Daten, die Wiederherstellung einer gemeinsamen Tabelle oder ein Redeployment aller Aufrufer braucht, dauert sie bei einem unklaren Fehler zu lange.
Halten Sie den alten Lesepfad während des Beobachtungsfensters verfügbar, aber nicht zwei unbeschränkte Schreiber. Wenn der neue Service Schreibhoheit hat, führen Sie seine festgeschriebenen Änderungen in den Kompatibilitätsspeicher des Monolithen zurück oder lassen Sie den Monolithen durch den Service lesen. Die erste Option ermöglicht einen schnellen Lese-Fallback, wenn Replikationsverzug sichtbar ist. Die zweite hält eine Wahrheit, macht aber die Serviceverfügbarkeit zum Teil des alten Pfads. Entscheiden Sie nach dem Ausfall, den Sie verkraften können.
Nutzen Sie eine Routensteuerung, die sich unabhängig vom Anwendungsdeployment ändert. Sie kann am Gateway, in einer Consumer-Zuweisung oder hinter einem serverseitigen Konfigurationsschalter liegen. Schützen Sie sie mit Zugriffskontrolle und Audit-Protokoll. Testen Sie die genaue Umkehr vor dem Cutover unter Last, einschließlich laufender Anfragen und wartender Nachrichten.
Definieren Sie Rollback-Auslöser als beobachtbare Werte. Eine steigende Fehlerrate übersieht semantische Beschädigung. Nehmen Sie Paritätsabweichungen, Queue-Alter, Duplikatrate, abgelehnte Zustandswechsel und fachliche Summen auf. Benennen Sie, wer den Rollback auslösen darf und wer nach der Verkehrsverlagerung diagnostiziert. Eine Notfallbesprechung ist keine Steuerungsebene.
Schemaänderungen müssen während des Rollback-Fensters kompatibel bleiben. Fügen Sie Felder hinzu, bevor sie Pflicht werden, dulden Sie alte und neue Darstellungen bei parallel laufenden Versionen und entfernen Sie alte Felder später. Datenbank-Rollback-Skripte beruhigen auf Papier, doch eine destruktive Migration nach neuen Schreibvorgängen umzukehren ist oft unmöglich. Vorwärtskompatible Schemaänderungen halten die Routingoption offen.
Nennen Sie nicht jeden Rückzug einen Fehlschlag. Wenn der Routenwechsel funktioniert, Belege erhalten bleiben und das Team eine semantische Abweichung findet, bevor Kunden davon abhängen, hat die Extraktionsmechanik ihre Aufgabe erfüllt. Gescheitert ist eine Situation, in der nur eine improvisierte Datenänderung zurückführt.
Eine Freigabe braucht Besitzer, Grenzwerte und Zeit
Ein Cutover ist bereit, wenn benannte Personen anhand aktueller Belege über Fortsetzen, Halten oder Umkehren entscheiden können. Ein Kalendereintrag und ein Dashboard schaffen diese Fähigkeit nicht. Das Team braucht ein Betriebsprotokoll, das jedes Signal mit einer Aktion und jede Aktion mit einer verantwortlichen Rolle verbindet.
Schreiben Sie vor Beginn des Shadow Traffic ein Freigabeblatt. Benennen Sie Kandidatenversion, Routensteuerung, Datenmarke, Kompatibilitätsmodus, erwartete Queue-Tiefe, erlaubte Latenzänderung, Paritätsregeln und die Person, die Traffic verschieben darf. Halten Sie die genauen Befehle oder Bedienaktionen für jede Traffic-Stufe und Umkehr fest. Hängt das Verfahren davon ab, dass ein einzelner Engineer einen undokumentierten Schalter kennt, proben Sie es, bis diese Abhängigkeit verschwindet.
Verschieben Sie Traffic in Stufen, die Lasteffekte zeigen, ohne in jeder Phase eine neue Datenautorität zu schaffen. Für zustandslose Lesezugriffe kann prozentuales Routing genügen. Routen Sie zustandsbehaftete Arbeit über eine stabile Partition wie Konto-ID, Jobtyp oder Mandant, damit eine Einheit nicht zwischen Implementierungen springt. Speichern Sie die Zuordnung. Zufälliges prozentuales Routing für zusammengehörige Schreibvorgänge kann einen Ablauf auf zwei Besitzer verteilen und den Fehler sporadisch erscheinen lassen.
Zeit wirkt auf zwei Arten. Der neue Service braucht genug Exposition für repräsentative Arbeit, und jede Freigabestufe braucht eine maximale Verweildauer bis zu einer bewussten Entscheidung. Ein unbegrenzt laufender Teil-Rollout kann zur dauerhaften Architektur mit zwei Dashboards, zwei Runbooks und unklarem Besitzer werden. Bestimmen Sie den Zeitpunkt nach Traffic-Mustern, nicht nach Geduld des Managements. Ein wichtiger täglicher Batch muss vor der Freigabe laufen. Für einen Quartalsendpfad ist ein aufgezeichnetes Replay sinnvoll, wenn Warten unvernünftig wäre.
Trennen Sie Infrastruktur- von Semantikgrenzen. CPU-Sättigung, erschöpfte Verbindungen, wachsende Queues und Timeouts zeigen, ob der Service Last trägt. Zustandssummen, Übergangszahlen, Rundungsergebnisse, Berechtigungsentscheidungen und geplante Nebenwirkungen zeigen, ob er das richtige Verhalten trägt. Ein schnelles, falsches Release sollte früher stoppen als ein vorübergehend langsames, korrektes.
Nutzen Sie während des Rollouts ein knappes Entscheidungsprotokoll:
- Der Release-Verantwortliche erfasst Traffic-Partition und Datenmarke vor der Routenänderung.
- Der Beobachter bestätigt Infrastrukturwerte und Paritätsergebnisse für diese Partition.
- Der Domänenverantwortliche klassifiziert jede neue semantische Abweichung als erklärt, blockierend oder mit schriftlichem Grund akzeptiert.
- Der Incident-Verantwortliche bestätigt, dass eine Umkehr mit aktuellem Schema und wartender Arbeit möglich bleibt.
- Der Release-Verantwortliche gibt frei, hält oder kehrt um und dokumentiert die verwendeten Belege.
Das ist keine Zeremonie um ihrer selbst willen. Es verhindert ein bekanntes Muster: Die Infrastruktur wirkt gesund, der Rollout schreitet fort, und eine ungeklärte fachliche Abweichung bleibt für die nächste Schicht liegen, weil niemand die Freigabe stoppen darf. Das Protokoll macht Unsicherheit sichtbar, solange Umkehr noch billig ist.
Führen Sie eine Uhr für technische und eine für Datenwiederherstellung. Zurückzurouten kann Sekunden dauern, verpasste Ereignisse erneut abzuspielen oder eine Projektion neu aufzubauen länger. Nennen Sie beide Ziele. Wer den Rollback für beendet erklärt, sobald Anfragen wieder den Monolithen erreichen, versteckt offene Reparatur und löscht womöglich Belege zu früh.
Die Freigabe endet erst nach der Bereinigung der Hoheit. Entfernen Sie temporäre Dual-Read-Pfade, entziehen Sie überholte Datenbankrechte, archivieren Sie Vergleiche nach der vereinbarten Aufbewahrung und aktualisieren Sie Servicekatalog und Bereitschaftsweg. Bleiben Migrationsrechte bestehen, wird aus einer kontrollierten Brücke eine inoffizielle Dauerschnittstelle. Die nächste Extraktion sollte mit weniger verborgenen Pfaden beginnen.
Die erste Extraktion prüft das Migrationssystem
Der erste Service ist erfolgreich, wenn die Organisation die Methode mit besseren Belegen und weniger Koordination wiederholen kann. Sein fachlicher Wert zählt, doch sein zweites Ergebnis ist ein getestetes Migrationssystem: Abhängigkeitssuche, Vertragserfassung, Traffic-Replay, Datenübertragung, Freigabegates und umkehrbares Routing.
Halten Sie fest, wo der Plan der Produktion widersprach. Vielleicht besaß eine Stored Procedure einen Schreibvorgang, den die Codesuche nicht fand. Vielleicht nutzten Wiederholungen keine gemeinsame Kennung. Vielleicht kam die größte Payload aus einem Quartalsjob. Machen Sie aus jeder Überraschung eine automatisierte Abfrage, einen Trace oder ein Gate für den nächsten Kandidaten. Eine Retrospektive ohne veränderte Kontrolle bewahrt nur die Geschichte.
Halten Sie den neuen Service nach dem Start betrieblich unabhängig. Geben Sie ihm ein eigenes deploybares Artefakt, Zustands- und Fachsignale, Ressourcengrenzen, Bereitschaftsverantwortung und ein Runbook für festhängende Arbeit. Verlangen Sie für Implementierungsänderungen kein Monolith-Release. Lassen Sie seine Datenbank nicht zum bequemen Reporting-Schema neuer Verbraucher werden. Jeder direkte Leser schafft ein weiteres künftiges Extraktionsproblem.
Architekturmodernisierung sollte beobachtetem Verhalten folgen, statt alte Module in neue Prozesse zu übertragen. Eine Analyse des gesamten Codebestands hilft, weil Legacy-Verhalten oft Sprachgrenzen, Stored Procedures, Batchdateien und Clientcode überschreitet. CodeHero liest diese Quellen gemeinsam und liefert Umschreibungen in unter 30 Tagen. Die Geschwindigkeit ersetzt weder einen benannten Datenbesitzer noch den Test der Umkehr.
Wählen Sie den Kandidaten, dessen Fehler begrenzbar ist, dessen Schreibvorgänge einen Besitzer haben können und dessen Aufrufer eine Netzwerkgrenze ohne verteilte Transaktion überstehen. Beweisen Sie das mit aufgezeichnetem Traffic und ziehen Sie die Route vor dem echten Cutover einmal zurück. Ein Team, das die Umkehr nie ausgeführt hat, besitzt ein Rollback-Dokument, aber keine Rollback-Fähigkeit.
FAQ
Welcher Service eignet sich am besten für die erste Extraktion aus einem Monolithen?
Wählen Sie eine Verantwortung mit einem eindeutigen Datenbesitzer, einer schmalen Schreibfläche und einem Ausfall, der die Haupttransaktion nicht blockiert. Asynchrone Jobs wie Exporte oder Dokumentverarbeitung eignen sich oft besser als Kunden-, Auftrags- oder Authentifizierungsdomänen.
Sollte der erste Microservice das einfachste Modul im Codebestand sein?
Nur wenn er sich auch leicht eigenständig betreiben lässt. Ein ordentliches Modul mit gemeinsamen Tabellen und Transaktionen lässt sich leicht verschieben, aber schwer releasen, beobachten und zurückrollen.
Darf ein neuer Service anfangs die Datenbank des Monolithen teilen?
Er kann die Infrastruktur vorübergehend teilen, braucht aber die alleinige Hoheit über seine geschriebenen Zeilen. Zwei legitime Schreiber schaffen Unklarheit, und Fremdschlüssel über die Grenze halten Deployments gekoppelt.
Wie findet man verborgene Datenbankschreiber vor der Extraktion?
Verbinden Sie Repository-Suche mit Statement-Logs, Traces, Trigger-Prüfung, Verzeichnissen geplanter Jobs und Operator-Skripten. Beobachten Sie einen vollständigen Geschäftszyklus, damit seltene Abstimmungen und Monatsabschlussarbeiten nicht fehlen.
Warum sind doppelte Schreibvorgänge während einer Service-Migration unsicher?
Der erste Vorgang kann festschreiben, während der zweite in einen Timeout läuft. Der Aufrufer weiß dann nicht, ob eine Wiederholung repariert oder dupliziert. Nutzen Sie einen Schreiber, stabile Idempotenzkennungen und eine Transactional Outbox für Änderungen an andere Komponenten.
Was bedeutet Datenunabhängigkeit für einen Microservice?
Der Service ist die einzige Autorität, die Änderungen an seinen Datensätzen prüft und festschreibt. Andere Komponenten dürfen Projektionen oder Caches halten, aber den maßgeblichen Zustand nicht direkt bearbeiten.
Wie prüfen Teams Verhaltensparität nach einer Extraktion?
Spielen Sie repräsentativen aufgezeichneten Traffic in ein isoliertes Shadow-Deployment und vergleichen Sie normalisierte Fachergebnisse und geplante Nebenwirkungen. Statuscodes und Prozesszustand reichen nicht, wenn Geld, Berechtigungen oder dauerhafte Daten abweichen können.
Was macht eine Service-Extraktion leicht rückgängig?
Ein Routen- oder Consumer-Wechsel stoppt neuen Traffic, während eine maßgebliche Historie intakt bleibt. Kompatible Schemas, sichtbarer Replikationsverzug und ein geprobter Umgang mit laufender Arbeit halten den Schalter im Vorfall nutzbar.
Reicht das Strangler-Fig-Muster für eine sichere Monolith-Aufteilung?
Es liefert eine nützliche Routingstrategie, klärt aber weder Datenhoheit, Transaktionsgrenzen noch Retry-Semantik. Ergänzen Sie die Fassade um einen ausdrücklichen Schreibbesitzer, Paritätsbelege und ein Rollback-Design.
Wie lange sollte die alte Implementierung verfügbar bleiben?
Behalten Sie sie für ein definiertes Beobachtungsfenster, das normalen Traffic, Spitzenfälle, Wiederholungen und wichtige geplante Arbeit umfasst. Entfernen Sie sie, wenn Freigabegates bestanden sind und der Rollback nicht mehr von ungeklärtem Verhalten abhängt, nicht an einem willkürlichen Datum.