Entwerfen von Microservices im Rahmen der taktischen DDD-PhaseUsing tactical DDD to design microservices

Während der strategischen DDD-Phase entwerfen Sie die Geschäftsdomäne und definieren Kontextgrenzen für Ihre Domänenmodelle.During the strategic phase of DDD, you are mapping out the business domain and defining bounded contexts for your domain models. In der taktischen DDD-Phase definieren Sie Ihre Domänenmodelle mit größerer Genauigkeit.Tactical DDD is when you define your domain models with more precision. Die taktischen Muster werden nur in einem Kontextgrenzenbereich angewendet.The tactical patterns are applied within a single bounded context. Bei einer Microservices-Architektur sind wir vor allem an den Entitäts- und Aggregatmustern interessiert.In a microservices architecture, we are particularly interested in the entity and aggregate patterns. Die Anwendung dieser Muster hilft uns dabei, natürliche Grenzen für die Dienste in unserer Anwendung zu identifizieren. (Weitere Informationen finden Sie im nächsten Artikel dieser Reihe.)Applying these patterns will help us to identify natural boundaries for the services in our application (see the next article in this series). Es gilt das allgemeine Prinzip, dass ein Microservice nicht kleiner als ein Aggregat und nicht größer als eine Kontextgrenze sein sollte.As a general principle, a microservice should be no smaller than an aggregate, and no larger than a bounded context. Zuerst überprüfen wir die taktischen Muster.First, we'll review the tactical patterns. Anschließend wenden wir sie auf die Kontextgrenze „Lieferung“ in der Anwendung für die Drohnenlieferung an.Then we'll apply them to the Shipping bounded context in the Drone Delivery application.

Übersicht über die taktischen MusterOverview of the tactical patterns

Dieser Abschnitt enthält eine kurze Zusammenfassung der taktischen DDD-Muster. Unter Umständen können Sie diesen Abschnitt also überspringen, falls Sie mit DDD bereits vertraut sind.This section provides a brief summary of the tactical DDD patterns, so if you are already familiar with DDD, you can probably skip this section. Die Muster werden im Buch von Eric Evans (Kapitel 5 und 6) und in Implementing Domain-Driven Design von Vaughn Vernon ausführlicher beschrieben.The patterns are described in more detail in chapters 5 – 6 of Eric Evans' book, and in Implementing Domain-Driven Design by Vaughn Vernon.

Diagramm taktischer Muster für DDD (Domain-Driven Design)

Entitäten:Entities. Eine Entität ist ein Objekt mit einer eindeutigen Identität, die bestehen bleibt.An entity is an object with a unique identity that persists over time. In einer Anwendung für Bankgeschäfte sind Kunden und Konten beispielsweise Entitäten.For example, in a banking application, customers and accounts would be entities.

  • Eine Entität verfügt im System über einen eindeutigen Bezeichner, mit dem die Entität nachgeschlagen bzw. abgerufen werden kann.An entity has a unique identifier in the system, which can be used to look up or retrieve the entity. Dies bedeutet nicht, dass der Bezeichner immer direkt für Benutzer verfügbar gemacht wird.That doesn't mean the identifier is always exposed directly to users. Es kann sich um eine GUID oder einen Primärschlüssel in einer Datenbank handeln.It could be a GUID or a primary key in a database.
  • Eine Identität kann übergreifend für mehrere Kontextgrenzenbereiche gelten und auch über die Lebensdauer der Anwendung hinaus beibehalten werden.An identity may span multiple bounded contexts, and may endure beyond the lifetime of the application. Beispielsweise sind Bankkontonummern oder von Behörden ausgestellte IDs nicht an die Lebensdauer einer bestimmten Anwendung gebunden.For example, bank account numbers or government-issued IDs are not tied to the lifetime of a particular application.
  • Die Attribute einer Entität können sich im Laufe der Zeit ändern.The attributes of an entity may change over time. Beispielsweise können sich Name oder Adresse einer Person ändern, während sich die Person nicht ändert.For example, a person's name or address might change, but they are still the same person.
  • Eine Entität kann Verweise auf andere Entitäten enthalten.An entity can hold references to other entities.

Wertobjekte:Value objects. Ein Wertobjekt hat keine Identität.A value object has no identity. Es wird allein durch die Werte seiner Attribute definiert.It is defined only by the values of its attributes. Außerdem sind Wertobjekte unveränderlich.Value objects are also immutable. Für die Aktualisierung eines Wertobjekts erstellen Sie immer eine neue Instanz, um die alte zu ersetzen.To update a value object, you always create a new instance to replace the old one. Wertobjekte können über Methoden verfügen, in denen die Domänenlogik gekapselt ist, aber diese Methoden sollten nicht mit Nebenwirkungen in Bezug auf den Status des Objekts verbunden sein.Value objects can have methods that encapsulate domain logic, but those methods should have no side-effects on the object's state. Typische Beispiele für Wertobjekte sind Farben, Datum und Uhrzeit und Währungswerte.Typical examples of value objects include colors, dates and times, and currency values.

Aggregate:Aggregates. Ein Aggregat definiert eine Konsistenzgrenze für eine oder mehrere Entitäten.An aggregate defines a consistency boundary around one or more entities. Eine bestimmte Entität in einem Aggregat ist die Stammentität.Exactly one entity in an aggregate is the root. Die Suche wird anhand des Bezeichners der Stammentität durchgeführt.Lookup is done using the root entity's identifier. Alle anderen Entitäten im Aggregat sind untergeordnete Elemente der Stammentität, und es wird darauf verwiesen, indem den Zeigern der Stammentität gefolgt wird.Any other entities in the aggregate are children of the root, and are referenced by following pointers from the root.

Der Zweck eines Aggregats ist die Modellierung von Transaktionsinvarianten.The purpose of an aggregate is to model transactional invariants. Reale Dinge weisen komplexe Beziehungsgeflechte auf.Things in the real world have complex webs of relationships. Kunden geben Bestellungen auf, Bestellungen enthalten Produkte, Produkte haben Lieferanten usw.Customers create orders, orders contain products, products have suppliers, and so on. Wenn von der Anwendung mehrere zusammengehörige Objekte geändert werden, wie kann dann die Konsistenz gewährleistet werden?If the application modifies several related objects, how does it guarantee consistency? Wie können Invarianten nachverfolgt und erzwungen werden?How do we keep track of invariants and enforce them?

In herkömmlichen Anwendungen wurden häufig Datenbanktransaktionen eingesetzt, um Konsistenz zu erzwingen.Traditional applications have often used database transactions to enforce consistency. In einer verteilten Anwendung ist dies aber oftmals nicht möglich.In a distributed application, however, that's often not feasible. Eine einzelne Geschäftstransaktion kann sich unter Umständen über mehrere Datenspeicher erstrecken, eine lange Ausführungsdauer aufweisen oder Drittanbieterdienste umfassen.A single business transaction may span multiple data stores, or may be long running, or may involve third-party services. Letztendlich liegt es an der Anwendung und nicht an der Datenschicht, die für die Domäne erforderlichen Invarianten zu erzwingen.Ultimately it's up to the application, not the data layer, to enforce the invariants required for the domain. Für die Durchführung dieser Modellierung sind Aggregate bestimmt.That's what aggregates are meant to model.

Hinweis

Ein Aggregat kann ggf. aus einer einzelnen Entität ohne untergeordnete Entitäten bestehen.An aggregate might consist of a single entity, without child entities. Durch die Transaktionsgrenze wird dies zu einem Aggregat.What makes it an aggregate is the transactional boundary.

Domänen- und Anwendungsdienste:Domain and application services. In der DDD-Terminologie ist ein Dienst ein Objekt, mit dem Logik implementiert wird, ohne dass ein Zustand vorgehalten wird.In DDD terminology, a service is an object that implements some logic without holding any state. Evans unterscheidet zwischen Domänendiensten, in denen die Domänenlogik gekapselt ist, und Anwendungsdiensten, mit denen die technische Funktionalität bereitgestellt wird, z.B. die Benutzerauthentifizierung oder das Senden einer SMS-Nachricht.Evans distinguishes between domain services, which encapsulate domain logic, and application services, which provide technical functionality, such as user authentication or sending an SMS message. Domänendienste werden häufig zum Modellieren von Verhalten verwendet, das mehrere Entitäten umfasst.Domain services are often used to model behavior that spans multiple entities.

Hinweis

Der Begriff Dienst ist im Bereich der Softwareentwicklung mehrfach besetzt.The term service is overloaded in software development. Die Definition bezieht sich in diesem Fall nicht direkt auf Microservices.The definition here is not directly related to microservices.

Domänenereignisse:Domain events. Domänenereignisse können verwendet werden, um andere Teile des Systems zu benachrichtigen, wenn etwas passiert.Domain events can be used to notify other parts of the system when something happens. Wie der Name bereits vermuten lässt, sollten Domänenereignisse eine bestimmte Bedeutung innerhalb der Domäne haben.As the name suggests, domain events should mean something within the domain. Der Vorgang „Datensatz wurde in eine Tabelle eingefügt“ ist beispielsweise kein Domänenereignis.For example, "a record was inserted into a table" is not a domain event. Der Vorgang „Lieferung wurde storniert“ ist ein Domänenereignis."A delivery was cancelled" is a domain event. Domänenereignisse sind besonders in einer Microservices-Architektur relevant.Domain events are especially relevant in a microservices architecture. Da Microservices verteilt vorliegen und keine Datenspeicher gemeinsam nutzen, stellen Domänenereignisse eine Möglichkeit dar, wie sich Microservices untereinander koordinieren können.Because microservices are distributed and don't share data stores, domain events provide a way for microservices to coordinate with each other. Im Artikel zur Kommunikation zwischen Diensten wird das asynchrone Messaging ausführlicher beschrieben.The article Interservice communication discusses asynchronous messaging in more detail.

Es gibt noch einige andere DDD-Muster, die hier nicht aufgeführt sind, z.B. Factorys, Repositorys und Module.There are a few other DDD patterns not listed here, including factories, repositories, and modules. Dies können nützliche Muster für die Implementierung eines Microservice sein, aber sie sind weniger relevant, wenn es um das Entwerfen von Grenzen zwischen Microservices geht.These can be useful patterns for when you are implementing a microservice, but they are less relevant when designing the boundaries between microservice.

Drohnenlieferung: Anwenden der MusterDrone delivery: Applying the patterns

Wir beginnen mit den Szenarien, die vom Kontextgrenzenbereich „Lieferung“ verarbeitet werden müssen.We start with the scenarios that the Shipping bounded context must handle.

  • Ein Kunde kann eine Drohne anfordern, um Waren von einem Unternehmen abzuholen, das beim Dienst für die Drohnenlieferung registriert ist.A customer can request a drone to pick up goods from a business that is registered with the drone delivery service.
  • Der Absender generiert eine Kennzeichnung per Tag (Strichcode oder RFID) für das Paket.The sender generates a tag (barcode or RFID) to put on the package.
  • Eine Drohne holt ein Paket ab und liefert es vom Ausgangsort an den Zielort.A drone will pick up and deliver a package from the source location to the destination location.
  • Wenn ein Kunde eine Lieferung plant, wird vom System eine geschätzte Ankunftszeit angegeben, die auf den Routeninformationen, Wetterbedingungen und Verlaufsdaten basiert.When a customer schedules a delivery, the system provides an ETA based on route information, weather conditions, and historical data.
  • Wenn eine Drohne in der Luft ist, kann ein Benutzer den aktuellen Standort und die zuletzt ermittelte geschätzte Ankunftszeit nachverfolgen.When the drone is in flight, a user can track the current location and the latest ETA.
  • Der Kunde kann eine Lieferung stornieren, bis eine Drohne das Paket abgeholt hat.Until a drone has picked up the package, the customer can cancel a delivery.
  • Der Kunde wird benachrichtigt, wenn die Lieferung abgeschlossen ist.The customer is notified when the delivery is completed.
  • Der Absender kann vom Kunden eine Bestätigung der Lieferung in Form einer Signatur oder eines Fingerabdrucks anfordern.The sender can request delivery confirmation from the customer, in the form of a signature or finger print.
  • Benutzer können den Verlauf einer abgeschlossenen Lieferung anzeigen.Users can look up the history of a completed delivery.

Anhand dieser Szenarien hat das Entwicklungsteam die folgenden Entitäten identifiziert.From these scenarios, the development team identified the following entities.

  • LieferungDelivery
  • PaketPackage
  • DrohneDrone
  • KontoAccount
  • BestätigungConfirmation
  • BenachrichtigungNotification
  • TagTag

Die ersten vier Entitäten (Lieferung, Paket, Drohne und Konto) sind allesamt Aggregate, die für die Grenzen der Transaktionskonsistenz stehen.The first four, Delivery, Package, Drone, and Account, are all aggregates that represent transactional consistency boundaries. Bestätigungen und Benachrichtigungen sind untergeordnete Elemente von Lieferungen, und Tags sind untergeordnete Elemente von Paketen.Confirmations and Notifications are child entities of Deliveries, and Tags are child entities of Packages.

Zu den Wertobjekten dieses Entwurfs gehören Standort, geschätzte Ankunftszeit, Paketgewicht und Paketgröße (Location, ETA, PackageWeight und PackageSize).The value objects in this design include Location, ETA, PackageWeight, and PackageSize.

Zur besseren Veranschaulichung ist hier ein UML-Diagramm des Aggregats für die Lieferung (Delivery) angegeben.To illustrate, here is a UML diagram of the Delivery aggregate. Beachten Sie, dass es Verweise auf andere Aggregate enthält, z.B. Konto (Account), Paket (Package) und Drohne (Drone).Notice that it holds references to other aggregates, including Account, Package, and Drone.

UML-Diagramm des Aggregats für die Lieferung (Delivery)

Es sind zwei Domänenereignisse vorhanden:There are two domain events:

  • Während eine Drohne in der Luft ist, sendet die Drone-Entität DroneStatus-Ereignisse, mit denen der Standort und Status (Flug, Gelandet) der Drohne beschrieben werden.While a drone is in flight, the Drone entity sends DroneStatus events that describe the drone's location and status (in-flight, landed).

  • Die Delivery-Entität sendet jeweils DeliveryTracking-Ereignisse, wenn sich die Phase einer Lieferung ändert.The Delivery entity sends DeliveryTracking events whenever the stage of a delivery changes. Beispiele hierfür sind DeliveryCreated, DeliveryRescheduled, DeliveryHeadedToDropoff und DeliveryCompleted.These include DeliveryCreated, DeliveryRescheduled, DeliveryHeadedToDropoff, and DeliveryCompleted.

Beachten Sie, dass diese Ereignisse Dinge beschreiben, die innerhalb des Domänenmodells eine Bedeutung haben.Notice that these events describe things that are meaningful within the domain model. Sie beschreiben einen Aspekt der Domäne und sind nicht an ein Konstrukt einer bestimmten Programmiersprache gebunden.They describe something about the domain, and aren't tied to a particular programming language construct.

Das Entwicklungsteam hat noch einen weiteren Funktionalitätsbereich identifiziert, der nicht ohne Weiteres einer der bisher beschriebenen Entitäten zugeordnet werden kann.The development team identified one more area of functionality, which doesn't fit neatly into any of the entities described so far. Ein Teil des Systems muss alle Schritte koordinieren, die an der Planung oder Aktualisierung einer Lieferung beteiligt sind.Some part of the system must coordinate all of the steps involved in scheduling or updating a delivery. Aus diesem Grund hat das Entwicklungsteam dem Entwurf zwei Domänendienste hinzugefügt: einen Scheduler zum Koordinieren der Schritte und einen Supervisor, mit dem der Status der einzelnen Schritte überwacht und erkannt werden soll, ob für Schritte ein Fehler oder eine Zeitüberschreitung aufgetreten ist. Dies ist eine Variante des Musters „Scheduler-Agent-Supervisor“.Therefore, the development team added two domain services to the design: a Scheduler that coordinates the steps, and a Supervisor that monitors the status of each step, in order to detect whether any steps have failed or timed out. This is a variation of the Scheduler Agent Supervisor pattern.

Diagramm des überarbeiteten Domänenmodells

Nächste SchritteNext steps

Im nächsten Schritt werden die Grenzen für die einzelnen Microservices definiert.The next step is to define the boundaries for each microservice.