Softwarearchitektur verstehen und entscheiden

Aaron KreisÜber mich
Domänenarchitektur

Anti Corruption Layer

Übersetzungsschicht zum Schutz des eigenen Modells

Die Idee und ihr Nutzen

Eine Versicherung baut ein neues Kundenportal, in dem Kunden ihre Verträge ansehen. Die Vertragsdaten liegen aber weiterhin in einem alten Bestandssystem auf einem Großrechner, das alle Verträge verwaltet. Dort steht ein Vertrag verteilt auf viele Datensätze, und viele Angaben stehen als Codewerte darin, also als Abkürzungen und Zahlen, deren Bedeutung man nachschlagen muss: Die Sparte Hausrat steht zum Beispiel als SPT=03 im Datensatz. Ein eigener Programmteil zwischen Kundenportal und Großrechner liest die alten Datensätze, übersetzt die Codewerte und liefert dem Kundenportal einen verständlichen Vertrag mit Angaben wie „Sparte Hausrat“ und „Beitrag in Euro“. Dieser Programmteil heißt Anti Corruption Layer, auf Deutsch etwa „Schutzschicht gegen Verfälschung“. Der Name meint: Ohne diese Schicht würden Codewerte wie SPT=03 in den Code des Kundenportals gelangen, und das Kundenportal würde mit den Begriffen des Großrechners arbeiten statt mit seinen eigenen, verständlichen Begriffen.

Bausteine: Kundenportal: kennt nur verständliche Verträge; Anti Corruption Layer: übersetzt Codewerte in verständliche Angaben; Großrechner: Codewerte, über viele Datensätze verteilt. Verbindungen: Kundenportal — Anti Corruption Layer („Sparte Hausrat“, „Beitrag in Euro“); Anti Corruption Layer — Großrechner („SPT=03“, Beitrag in Cent). Nur der Anti Corruption Layer kennt die alten Codewerte; das Kundenportal sieht nur verständliche Verträge.

Wie funktioniert es?

Eine Kundin meldet sich im Kundenportal an und öffnet ihren Hausratvertrag mit der Nummer 88123. Das Kundenportal ruft an der eigenen Schnittstelle „Vertrag lesen(88123)“ auf. Eine Schnittstelle ist die vereinbarte Form eines Aufrufs, also sein Name, die übergebenen Angaben und die Art der Antwort. Die eigene Schnittstelle bietet dem Kundenportal Aufrufe in seinen eigenen Begriffen an, und das Kundenportal erfährt dabei nicht, woher die Daten kommen. Die eigene Schnittstelle gibt den Aufruf an die Fassade weiter, den einzigen Programmteil, der die Abfragen und Dateiformate des Großrechners kennt. Auf dem Großrechner besteht ein Vertrag aus einem Kopfsatz mit den Grunddaten und mehreren Folgesätzen mit Einzelheiten wie Deckungen und Zuschlägen. Die Fassade fragt beim Großrechner den Kopfsatz und die Folgesätze zu Vertrag 88123 ab. Der Großrechner liefert die Rohdaten: einen Kopfsatz, 12 Folgesätze, den Codewert SPT=03 und den Betrag 18750. Die Fassade reicht die Datensätze an den Übersetzer weiter, der die Bedeutung der alten Daten kennt. Der Übersetzer setzt Kopfsatz und Folgesätze zu einem Vertrag zusammen, macht aus SPT=03 die Sparte Hausrat und aus 18750 Cent den Betrag 187,50 Euro. Der Übersetzer gibt dem Kundenportal ein Objekt Vertrag zurück, also ein zusammengehöriges Datenpaket mit Sparte Hausrat, Vertragsbeginn und Jahresbeitrag 187,50 Euro, und die Kundin sieht „Hausrat, 187,50 € im Jahr“. Fünf Jahre später ersetzt ein neues Bestandssystem den Großrechner. Das neue Bestandssystem liefert einen Vertrag als einen einzigen Datensatz mit ausgeschriebener Sparte. Das Team des Kundenportals schreibt nur Fassade und Übersetzer neu. Das Kundenportal ruft unverändert „Vertrag lesen(88123)“ auf und erhält denselben Vertrag.

Kundenportal und Großrechner gehören unterschiedlichen Teams und sind in unterschiedlichen Jahrzehnten entstanden. Wie ein Vertrag im Kundenportal aussieht, legt das Team des Kundenportals fest: ein Objekt Vertrag mit Sparte, Beginn, Ende und Beitrag in Euro. Die Begriffe und Regeln, die das Team des Kundenportals so festlegt, heißen das Fachmodell des Kundenportals. Eigene Schnittstelle, Fassade und Übersetzer bilden zusammen den Anti Corruption Layer, einen Programmteil mit nur einer Aufgabe: zwischen dem Fachmodell des Kundenportals und den Daten des Großrechners zu übersetzen. Das Team des Kundenportals legt die eigene Schnittstelle fest, der Anti Corruption Layer bietet sie an, und das Kundenportal ruft sie auf. Die Fassade fasst die vielen einzelnen Abfragen des Großrechners zu wenigen Aufrufen zusammen, etwa zu einem Aufruf für alle Datensätze eines Vertrags. Welche Sparte sich hinter einem Codewert wie SPT=03 verbirgt, wie Kopfsatz und Folgesätze zusammengehören und dass Beträge in Cent gespeichert sind, muss das Team des Kundenportals erst herausfinden und im Übersetzer hinterlegen. Die Bedeutung der Codewerte steht in alten Handbüchern und ist nur noch wenigen Fachleuten bekannt. Den Großrechner selbst ändert niemand: Er bleibt noch Jahre im Betrieb, und viele andere Programme der Versicherung hängen von seinem Datenformat ab. Schneller oder zuverlässiger macht der Anti Corruption Layer den Großrechner nicht.

Findet der Übersetzer einen Codewert, den er nicht kennt, oder antwortet der Großrechner nicht, meldet der Anti Corruption Layer dem Kundenportal einen Fehler in den Begriffen des Kundenportals, etwa „Vertrag derzeit nicht lesbar“. Den unbekannten Codewert reicht der Anti Corruption Layer nicht weiter, damit kein Begriff des Großrechners in das Kundenportal gelangt. Ändert sich bei der Ablösung des Großrechners auch die fachliche Bedeutung der Daten, genügt es nicht, Fassade und Übersetzer neu zu schreiben. Fasst das neue Bestandssystem zum Beispiel Hausrat und Haftpflicht zu einem einzigen Vertrag zusammen, während der Großrechner sie als zwei Verträge führt, muss auch das Kundenportal angepasst werden.

Anti Corruption Layer: der Altvertrag kommt als verständlicher Vertrag im Portal an

Beteiligte: Kundin: öffnet ihren Hausratvertrag; Kundenportal: kennt nur „Vertrag lesen“ und das Objekt Vertrag; Eigene Schnittstelle: „Vertrag lesen“ in der Sprache des Portals; Fassade: kennt Abfragen und Dateiformate des Großrechners; Großrechner: Kopfsatz + Folgesätze, SPT=03, Cent; Übersetzer: kennt die Bedeutung der alten Daten. Ablauf: 1. Die Kundin meldet sich im Kundenportal an und öffnet ihren Hausratvertrag 88123. 2. Das Kundenportal ruft an der eigenen Schnittstelle „Vertrag lesen(88123)“ auf. Woher die Daten kommen, erfährt das Kundenportal nicht. 3. Die eigene Schnittstelle gibt den Aufruf an die Fassade zum Großrechner weiter. 4. Die Fassade fragt beim Großrechner den Kopfsatz und die Folgesätze zu Vertrag 88123 ab. Nur die Fassade kennt die Abfragen des Großrechners. 5. Der Großrechner liefert die Rohdaten: einen Kopfsatz, 12 Folgesätze, den Codewert SPT=03 und den Betrag 18750. 6. Die Fassade reicht die Datensätze an den Übersetzer weiter. 7. Der Übersetzer setzt Kopf- und Folgesätze zu einem Vertrag zusammen, macht aus SPT=03 die Sparte Hausrat und aus 18750 Cent 187,50 Euro. 8. Der Übersetzer gibt dem Kundenportal ein Objekt Vertrag mit Sparte Hausrat und Jahresbeitrag 187,50 Euro zurück. 9. Die Kundin sieht „Hausrat, 187,50 € im Jahr“. 10. Fünf Jahre später ersetzt ein neues Bestandssystem den Großrechner. Das Team des Kundenportals hat nur Fassade und Übersetzer neu geschrieben; das Kundenportal ruft unverändert „Vertrag lesen(88123)“ auf und erhält denselben Vertrag.

Wann ist es sinnvoll und wann nicht?

Ein Anti Corruption Layer lohnt sich

  • Ein neues System braucht Daten aus einem Altsystem, dessen Begriffe und Aufbau es nicht übernehmen soll. Ohne Anti Corruption Layer müsste das Kundenportal in jedem Programmteil, der einen Vertrag anzeigt, die Codewerte entschlüsseln, Folgesätze zusammensuchen und Cent in Euro umrechnen. Mit Anti Corruption Layer weiß nur der Übersetzer, dass SPT=03 die Sparte Hausrat bedeutet, wie Kopfsatz und Folgesätze zusammengehören und dass Beträge in Cent stehen. Automatische Tests geben dem Übersetzer alte Datensätze und prüfen, ob der erwartete Vertrag herauskommt; so prüft das Team die ganze Übersetzung an einem einzigen Programmteil.
  • Die alten Begriffe sollen sich nicht im neuen System ausbreiten. Würde das Kundenportal die Datensätze des Großrechners direkt lesen, stünden die alten Begriffe bald in Variablennamen, Prüfregeln und Tests. Nach einigen Jahren wäre das Kundenportal dann genauso schwer zu verstehen wie das alte Bestandssystem. Mit Anti Corruption Layer bleibt der Code des Kundenportals auch für Entwickler ohne Wissen über den Großrechner verständlich.
  • Ein Altsystem wird schrittweise abgelöst, und alte und neue Teile müssen eine Zeit lang zusammenarbeiten. Ohne Anti Corruption Layer müsste das Team des Kundenportals bei der Ablösung jeden Programmteil suchen und ändern, der die alten Datensätze liest.
  • Ein System verarbeitet Daten externer Partner, deren Format die Versicherung nicht beeinflussen kann. Ohne Anti Corruption Layer müsste das Team jede Formatänderung eines Partners in allen Programmteilen nachziehen, die diese Daten lesen.

Ein Anti Corruption Layer ist nicht das Richtige

  • Das neue System und das Altsystem verwenden dieselben Begriffe, oder das fremde Datenformat entspricht weitgehend dem eigenen Fachmodell. Dann unterscheiden sich die beiden Systeme nur in der Form der Aufrufe. Dafür gibt es den Adapter, der nur die Form der Aufrufe anpasst. Einen Übersetzer, der die Bedeutung alter Codewerte kennt, braucht das Team dann nicht.
  • Die Daten werden nur einmal in einem Durchlauf in das neue System übernommen, und das Altsystem wird danach abgeschaltet. Dann übersetzt ein Übernahmeprogramm die Codewerte ein einziges Mal. Einen Anti Corruption Layer, den das Team jahrelang betreiben und pflegen müsste, gibt es nicht.
  • Das neue System darf das Fachmodell des Altsystems übernehmen. Das ist etwa bei einer kleinen Zusatzfunktion mit wenigen Feldern der Fall. Dann liest das neue System die Daten direkt mit den Begriffen des Altsystems, und das Team spart Fassade und Übersetzer.

Nachteile und typische Fehler

Der Anti Corruption Layer ist zusätzlicher Code, der viel Wissen über das Altsystem enthält. Dieses Wissen muss jemand herausfinden, aufschreiben und mit Tests absichern, oft mit Hilfe der wenigen Fachleute, die die Codewerte noch kennen. Jede Anfrage läuft durch einen weiteren Schritt, und bei großen Datenmengen macht das Übersetzen die Antworten spürbar langsamer. Wird der Anti Corruption Layer als eigener Dienst betrieben, muss das Team des Kundenportals diesen Dienst überwachen, ausliefern und bei steigender Last ebenso wie das Kundenportal mit mehr Rechenleistung ausstatten. Außerdem muss das Team des Kundenportals entscheiden, ob der Anti Corruption Layer nach der Ablösung des Großrechners bestehen bleibt oder abgebaut wird.

Typische Fehler und woran man sie erkennt:

  • Durchgereichte Codewerte: Der Anti Corruption Layer übersetzt nicht alle Felder, und alte Codewerte gelangen doch ins Kundenportal. Ein Entwickler reicht zum Beispiel unter Zeitdruck ein Feld unübersetzt durch. Erkennbar ist das an Feldern wie SPT in Variablennamen, Prüfregeln oder Tests des Kundenportals.
  • Eigene Fachlogik im Übersetzer: Das Team des Kundenportals baut immer mehr Entscheidungen in den Übersetzer ein, etwa welche Verträge ein Kunde sehen darf. Nach und nach entsteht ein eigenes System mit eigenen fachlichen Regeln. Erkennbar ist das, wenn fachliche Änderungen im Kundenportal regelmäßig auch Änderungen im Übersetzer erfordern.
  • Stillschweigend falsch übersetzt: Der Übersetzer setzt für jeden Codewert, den er nicht kennt, eine Standardsparte ein, statt einen Fehler zu melden. Der Großrechner führt einen neuen Codewert ein, und der Übersetzer ordnet ihn ohne Fehlermeldung dieser Standardsparte zu. Kunden sehen dann eine falsche Sparte. Erkennbar ist das an Beschwerden über falsche Vertragsangaben, während die Protokolle keine Fehler zeigen.
  • Anti Corruption Layer als Engpass: Der Anti Corruption Layer läuft als eigener Dienst und ist für die Last zu klein bemessen oder fällt aus. Das Kundenportal zeigt dann keine Verträge an, obwohl der Großrechner antwortet. Erkennbar ist das an langen Antwortzeiten oder Fehlern im Anti Corruption Layer, während die Antwortzeiten des Großrechners unauffällig sind.

Weiterführend

Verwandte Ansätze

  • Bounded Context: ein Bereich eines Systems, in dem Begriffe eine eindeutige Bedeutung haben; der Anti Corruption Layer schützt die Begriffe eines solchen Bereichs vor fremden Begriffen.
  • Domain Driven Design: die Entwurfsmethode, in der der Begriff Anti Corruption Layer geprägt wurde.
  • Facade: Entwurfsmuster, nach dem die Fassade zum Großrechner gebaut ist; zusammen mit dem Adapter ist die Facade ein häufiger Baustein eines Anti Corruption Layer.
  • Strangler Fig: Vorgehen, ein Altsystem in überschaubarer Zeit Funktion für Funktion zu ersetzen; solange alte und neue Teile nebeneinander laufen, verbindet oft ein Anti Corruption Layer die beiden.

Werkzeuge und Umsetzungen

Der Anti Corruption Layer ist eigener Code, weil nur die Versicherung selbst die Bedeutung der alten Daten kennt. Diese Projekte erleichtern Teile der Arbeit:

  • Apache Camel: verbindet Programme über viele alte und neue Übertragungsverfahren und enthält Bausteine, die Datenformate umwandeln. Camel kann die Fassade und Umwandlungen wie Cent in Euro übernehmen; die fachliche Bedeutung der Codewerte muss das Team des Kundenportals selbst hinterlegen.
  • MapStruct: erzeugt Java-Code, der Werte von einem Datenobjekt in ein anderes überträgt, etwa aus einem Objekt für den Kopfsatz in ein Objekt Vertrag.

Quellen