Die präzise Verwendung von Begriffen ist in Event-Driven Architecture von entscheidender Bedeutung. Wenn Teams beginnen, event-getriebene Systeme zu entwickeln, entstehen häufig Verwirrungen, weil die Begriffe “Event”, “Command” und “Message” unscharf verwendet werden. Diese begriffliche Unklarheit führt nicht nur zu Kommunikationsproblemen, sondern auch zu fehlerhaften Systemdesigns.
Beispiel: “Der Bestellservice sendet eine Message an das Zahlungssystem.” Handelt es sich um einen Command “VerarbeiteZahlung”, der explizit sagt, was zu tun ist? Oder um ein Event “BestellungAufgegeben”, das meldet, was passiert ist? Diese Unterscheidung hat weitreichende Auswirkungen auf Kopplung, Skalierbarkeit und Wartbarkeit.
Jede Kommunikation in einem System kann einer von drei Absichten zugeordnet werden: etwas bewirken (Command), über etwas informieren (Event), oder wissen, was der aktuelle Zustand ist (Query).
| Eigenschaft | Command | Event | Query |
|---|---|---|---|
| Zeitform | Imperativ | Vergangenheit | Frageform |
| Beispiele | ErstelleBestellungVerarbeiteZahlung |
BestellungErstelltZahlungVerarbeitet |
ZeigeBestellhistoriePrüfeLagerbestand |
| Absicht | Etwas bewirken | Über Geschehenes informieren | Information abfragen |
| Empfänger | Spezifischer Service | Alle interessierten Services | Spezifischer Service |
| Kopplung | Eng gekoppelt | Lose gekoppelt | Eng gekoppelt |
| Erfolgsgarantie | Kann fehlschlagen | Unveränderlicher Fakt | Kann fehlschlagen |
| Verarbeitung | Meist asynchron | Asynchron | Meist synchron |
| Antwort erwartet | Optional | Nein | Ja, sofort |
Command-Beispiel:
ErstelleBestellung {
kundenId: "K12345",
artikel: [{"id": "P001", "menge": 2}],
lieferadresse: {...}
}
→ Kann fehlschlagen (nicht verfügbar, ungültige Daten)
Event-Beispiel:
BestellungErstellt {
bestellId: "B78910",
kundenId: "K12345",
artikel: [{"id": "P001", "menge": 2}],
zeitstempel: "2025-01-15T10:30:00Z"
}
→ Unveränderlicher Fakt, mehrere Services reagieren
Query-Beispiel:
ZeigeBestellhistorie {
kundenId: "K12345",
zeitraum: "letzteWoche"
}
→ Synchrone Antwort mit Bestelldaten
| Pattern | Command | Event | Query |
|---|---|---|---|
| Adressierung | 1:1 (gerichtet) | 1:n (broadcast) | 1:1 (gerichtet) |
| Timing | “Tue das jetzt” | “Das ist passiert” | “Wie ist der Status?” |
| Verantwortung | Empfänger entscheidet | Jeder Consumer entscheidet | Empfänger antwortet |
| Fehlerverhalten | Rejection möglich | Keine Ablehnung | Fehlercodes möglich |
Nicht alle Events sind gleich. Die verschiedenen Event-Typen haben unterschiedliche Semantiken und Verwendungszwecke:
| Event-Typ | Zweck | E-Commerce-Beispiele | Eigenschaften |
|---|---|---|---|
| Domain Events | Geschäftsereignisse | KundeRegistriertBestellungStorniert |
Fachliche Bedeutung, langlebig |
| Integration Events | System-übergreifend | OrderPlaced (für
Partner)PaymentCompleted (extern) |
Versioniert, stabil |
| State Change Events | Zustandsübergänge | BestellungBestätigtBestellungVersandt |
Workflow-orientiert |
| Derived Events | Berechnete Ereignisse | KundeIstStammkundeLagerbestandNiedrig |
Aggregiert, regelbasiert |
| Prinzip | Beschreibung | Beispiel | Anti-Pattern |
|---|---|---|---|
| Unveränderlichkeit | Events dürfen nie geändert werden | Korrektur durch kompensierendes Event | Event nachträglich editieren |
| Geschäftsfokus | Events repräsentieren Geschäftsereignisse | KundeHatBestellt |
DatabaseRowUpdated |
| Vollständigkeit | Alle nötigen Daten enthalten | Event mit Kunden- und Produktdaten | Nur IDs, Consumer muss nachfragen |
| Granularität | Bedeutsame Geschäftseinheiten | BestellungAbgeschlossen |
Event für jede Feldänderung |
Für effektives Design müssen Messages nach verschiedenen Kriterien kategorisiert werden:
| Kategorie | Charakteristika | Beispiele | Verarbeitung |
|---|---|---|---|
| Sofortige Messages | Zeitkritisch, geschäftskritisch | ZahlungFehlgeschlagenSicherheitsAlert |
Real-time Processing |
| Verzögerbare Messages | Tolerieren Latenz | NewsletterAnmeldungAnalyticsEvent |
Batch-Processing OK |
| Aufbewahrbare Messages | Langfristiger Wert | BestellungErstelltKundeRegistriert |
Permanent speichern |
| Vergängliche Messages | Kurzfristiger Wert | HeartbeatCheckTempStatusUpdate |
Nach Verarbeitung löschen |
| Reichweite | Zielgruppe | Versionierung | Beispiele |
|---|---|---|---|
| Interne Messages | Services innerhalb Bounded Context | Flexibel änderbar | KundenDatenValidiert |
| Externe Messages | System-übergreifend | Strikte Versionierung | OrderShipped (Partner-API) |
| Öffentliche Messages | Multiple externe Consumer | Langfristig stabil | ProductCatalogUpdated |
| Priorität | SLA | Retry-Strategie | E-Commerce-Beispiele |
|---|---|---|---|
| Kritisch | <100ms | Sofortige Wiederholung | ZahlungsEventsBetrugsAlerts |
| Normal | <5 Sekunden | Exponential Backoff | BestellEventsLagerUpdates |
| Best-Effort | Eventual | Limited Retries | AnalyticsEventsEmpfehlungsUpdates |
| Eigenschaft | Bedeutung | Design-Implikation | Beispiel |
|---|---|---|---|
| Idempotent | Mehrfachverarbeitung sicher | Einfache Retry-Logik | SetzeKundenStatus |
| Nicht-idempotent | Kumulative Effekte | Duplicate Detection nötig | ErhöheKontostand |
| Kausal | Reihenfolge wichtig | Ordering guarantees | BestellungErstellt →
BestellungBestätigt |
| Unabhängig | Reihenfolge egal | Parallele Verarbeitung | ProduktBewertungen |
Commands verwenden für:
Events verwenden für:
Queries verwenden für:
| Check | Frage | Beispiel |
|---|---|---|
| ✅ Klarheit | Ist der Message-Typ eindeutig? | BestelleProdukt (Command) vs
ProduktBestellt (Event) |
| ✅ Vollständigkeit | Enthält alle nötigen Daten? | Event mit Kunden-, Produkt- und Bestelldaten |
| ✅ Versionierung | Ist Backward-Compatibility gewährleistet? | Schema-Evolution ohne Breaking Changes |
| ✅ Granularität | Angemessene Geschäftseinheit? | KundeRegistriert statt 20 Feld-Update-Events |
| ✅ Timing | Korrekte sync/async Behandlung? | Commands async, Queries sync |
Die klare begriffliche Trennung zwischen Events, Commands und Queries bildet das konzeptionelle Rückgrat erfolgreicher event-getriebener Architekturen. Wenn Teams diese Konzepte verinnerlicht haben, entstehen Systeme, die nicht nur technisch robust sind, sondern auch die Geschäftslogik klar abbilden.