Muster „Antibeschädigungsebene“Anti-Corruption Layer pattern

Implementieren Sie eine Fassade oder Adapterebene zwischen unterschiedlichen Subsystemen ohne gemeinsame Semantik.Implement a façade or adapter layer between different subsystems that don't share the same semantics. Diese Ebene dient zum Übersetzen der Anforderungen, die ein Subsystem an ein anderes Subsystem richtet.This layer translates requests that one subsystem makes to the other subsystem. Verwenden Sie dieses Muster, um sicherzustellen, dass der Entwurf einer Anwendung nicht durch Abhängigkeiten von externen Systemen eingeschränkt wird.Use this pattern to ensure that an application's design is not limited by dependencies on outside subsystems. Dieses Muster wurde erstmals von Eric Evans in Domain-Driven Design beschrieben.This pattern was first described by Eric Evans in Domain-Driven Design.

Kontext und ProblemContext and problem

Die meisten Anwendungen basieren in Bezug auf einige Daten oder Funktionen auf anderen Systemen.Most applications rely on other systems for some data or functionality. Wenn eine ältere Anwendung beispielsweise zu einem modernen System migriert wird, werden dafür ggf. weiterhin vorhandene ältere Ressourcen benötigt.For example, when a legacy application is migrated to a modern system, it may still need existing legacy resources. Für neue Features muss das Aufrufen des älteren Systems möglich sein.New features must be able to call the legacy system. Dies gilt besonders für Migrationen, die schrittweise erfolgen und bei denen verschiedene Features einer größeren Anwendung im Laufe der Zeit auf ein modernes System verschoben werden.This is especially true of gradual migrations, where different features of a larger application are moved to a modern system over time.

Für diese älteren Systeme treten häufig Qualitätsprobleme auf, z.B. aufgrund von verworrenen Datenschemas oder veralteten APIs.Often these legacy systems suffer from quality issues such as convoluted data schemas or obsolete APIs. Die Features und Technologien, die in älteren Systemen eingesetzt werden, können sich von den Komponenten moderner Systeme stark unterscheiden.The features and technologies used in legacy systems can vary widely from more modern systems. Zur Sicherstellung der Interoperabilität mit dem älteren System muss die neue Anwendung ggf. veraltete Infrastruktur, Protokolle, Datenmodelle, APIs oder andere Features unterstützen, die Sie andernfalls nicht in eine moderne Anwendung integrieren würden.To interoperate with the legacy system, the new application may need to support outdated infrastructure, protocols, data models, APIs, or other features that you wouldn't otherwise put into a modern application.

Das Ermöglichen des Zugriffs zwischen neuen und alten Systemen kann für das neue System bedeuten, dass zumindest die Anforderungen einiger APIs oder anderer Semantiken des älteren Systems erfüllt werden müssen.Maintaining access between new and legacy systems can force the new system to adhere to at least some of the legacy system's APIs or other semantics. Wenn für diese älteren Features Qualitätsprobleme bestehen, kann deren Unterstützung zu einer Beschädigung der modernen Anwendung führen, die ansonsten sauber entworfen wurde.When these legacy features have quality issues, supporting them "corrupts" what might otherwise be a cleanly designed modern application.

Ähnliche Probleme können durch jedes externe System verursacht werden, das nicht von Ihrem Entwicklerteam kontrolliert wird (nicht nur durch Legacysysteme).Similar issues can arise with any external system that your development team doesn't control, not just legacy systems.

LösungSolution

Platzieren Sie zur Isolierung eine Antibeschädigungsebene zwischen unterschiedlichen Systemen.Isolate the different subsystems by placing an anti-corruption layer between them. Diese Ebene übersetzt die Kommunikation zwischen den beiden Systemen, sodass eines der Systeme unverändert bleiben kann und das Design sowie das technologische Konzept des anderen Systems nicht kompromittiert wird.This layer translates communications between the two systems, allowing one system to remain unchanged while the other can avoid compromising its design and technological approach.

Diagramm des Musters „Antibeschädigungsebene“

Das obige Diagramm zeigt eine Anwendung mit zwei Subsystemen.The diagram above shows an application with two subsystems. Aufrufe, die von Subsystem A an Subsystem B gerichtet werden, durchlaufen eine Antibeschädigungsebene.Subsystem A calls to subsystem B through an anti-corruption layer. Bei der Kommunikation zwischen Subsystem A und der Antibeschädigungsebene werden immer das Datenmodell und die Architektur des Subsystems A verwendet. Aufrufe, die von der Antibeschädigungsebene an Subsystem B gerichtet werden, entsprechen dagegen dem Datenmodell bzw. den Methoden dieses Subsystems.Communication between subsystem A and the anti-corruption layer always uses the data model and architecture of subsystem A. Calls from the anti-corruption layer to subsystem B conform to that subsystem's data model or methods. Die Antibeschädigungsebene enthält die gesamte Logik, die für die Übersetzung zwischen den beiden Systemen erforderlich ist.The anti-corruption layer contains all of the logic necessary to translate between the two systems. Die Ebene kann als Komponente zwischen der Anwendung oder als unabhängiger Dienst implementiert werden.The layer can be implemented as a component within the application or as an independent service.

Probleme und ÜberlegungenIssues and considerations

  • Die Antibeschädigungsebene kann die Wartezeit für Aufrufe erhöhen, die zwischen den beiden Systemen erfolgen.The anti-corruption layer may add latency to calls made between the two systems.
  • Mit der Antibeschädigungsebene wird ein zusätzlicher Dienst hinzugefügt, der verwaltet und gewartet werden muss.The anti-corruption layer adds an additional service that must be managed and maintained.
  • Überlegen Sie sich, wie Ihre Antibeschädigungsebene skaliert wird.Consider how your anti-corruption layer will scale.
  • Ermitteln Sie auch, ob Sie mehr als eine Antibeschädigungsebene benötigen.Consider whether you need more than one anti-corruption layer. Es kann ratsam sein, die Funktionalität mit verschiedenen Technologien oder Sprachen in mehrere Dienste zu unterteilen, oder es kann andere Gründe für die Partitionierung der Antibeschädigungsebene geben.You may want to decompose functionality into multiple services using different technologies or languages, or there may be other reasons to partition the anti-corruption layer.
  • Berücksichtigen Sie, wie die Antibeschädigungsebene in Verbindung mit anderen Anwendungen und Diensten verwaltet werden soll.Consider how the anti-corruption layer will be managed in relation with your other applications or services. Wie wird die Ebene in Ihre Überwachungs-, Release- und Konfigurationsprozesse integriert?How will it be integrated into your monitoring, release, and configuration processes?
  • Stellen Sie sicher, dass die Transaktions- und Datenkonsistenz gewahrt ist und überwacht werden kann.Make sure transaction and data consistency are maintained and can be monitored.
  • Überlegen Sie, ob die Antibeschädigungsebene die gesamte Kommunikation zwischen unterschiedlichen Systemen oder nur die Kommunikation bestimmter Features verarbeiten muss.Consider whether the anti-corruption layer needs to handle all communication between different subsystems, or just a subset of features.
  • Wenn die Antibeschädigungsebene Teil einer Anwendungsmigrationsstrategie ist, überlegen Sie sich, ob es sich dabei um eine dauerhafte Lösung handelt oder ob sie nach der Migration sämtlicher Legacyfunktionen nicht mehr benötigt wird.If the anti-corruption layer is part of an application migration strategy, consider whether it will be permanent, or will be retired after all legacy functionality has been migrated.

Verwendung dieses MustersWhen to use this pattern

Verwenden Sie dieses Muster in folgenden Fällen:Use this pattern when:

  • Für eine Migration ist die Durchführung in mehreren Phasen geplant, aber die Integration zwischen neuen und älteren Systemen muss aufrechterhalten werden.A migration is planned to happen over multiple stages, but integration between new and legacy systems needs to be maintained.
  • Zwei oder mehr Subsysteme müssen trotz unterschiedlicher Semantik miteinander kommunizieren.Two or more subsystems have different semantics, but still need to communicate.

Dieses Muster ist ggf. ungeeignet, wenn zwischen neuem und altem System keine semantischen Unterschiede bestehen.This pattern may not be suitable if there are no significant semantic differences between new and legacy systems.