7 Events, Commands und Messages – begriffliche Trennung

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.

7.1 Command vs. Event vs. Query

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).

7.1.1 Grundlegende Unterschiede

Eigenschaft Command Event Query
Zeitform Imperativ Vergangenheit Frageform
Beispiele ErstelleBestellung
VerarbeiteZahlung
BestellungErstellt
ZahlungVerarbeitet
ZeigeBestellhistorie
Prü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

7.1.2 E-Commerce-Beispiel: Bestellprozess

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

7.1.3 Kommunikationsmuster

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

7.2 Event-Typen und Semantik

Nicht alle Events sind gleich. Die verschiedenen Event-Typen haben unterschiedliche Semantiken und Verwendungszwecke:

7.2.1 Event-Kategorien

Event-Typ Zweck E-Commerce-Beispiele Eigenschaften
Domain Events Geschäftsereignisse KundeRegistriert
BestellungStorniert
Fachliche Bedeutung, langlebig
Integration Events System-übergreifend OrderPlaced (für Partner)
PaymentCompleted (extern)
Versioniert, stabil
State Change Events Zustandsübergänge BestellungBestätigt
BestellungVersandt
Workflow-orientiert
Derived Events Berechnete Ereignisse KundeIstStammkunde
LagerbestandNiedrig
Aggregiert, regelbasiert

7.2.2 Event-Design-Prinzipien

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

7.3 Message-Kategorisierung und Verwendungszwecke

Für effektives Design müssen Messages nach verschiedenen Kriterien kategorisiert werden:

7.3.1 Temporale Klassifizierung

Kategorie Charakteristika Beispiele Verarbeitung
Sofortige Messages Zeitkritisch, geschäftskritisch ZahlungFehlgeschlagen
SicherheitsAlert
Real-time Processing
Verzögerbare Messages Tolerieren Latenz NewsletterAnmeldung
AnalyticsEvent
Batch-Processing OK
Aufbewahrbare Messages Langfristiger Wert BestellungErstellt
KundeRegistriert
Permanent speichern
Vergängliche Messages Kurzfristiger Wert HeartbeatCheck
TempStatusUpdate
Nach Verarbeitung löschen

7.3.2 Umfang und Reichweite

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

7.3.3 Priorität und Service Level

Priorität SLA Retry-Strategie E-Commerce-Beispiele
Kritisch <100ms Sofortige Wiederholung ZahlungsEvents
BetrugsAlerts
Normal <5 Sekunden Exponential Backoff BestellEvents
LagerUpdates
Best-Effort Eventual Limited Retries AnalyticsEvents
EmpfehlungsUpdates

7.3.4 Verarbeitungseigenschaften

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 BestellungErstelltBestellungBestätigt
Unabhängig Reihenfolge egal Parallele Verarbeitung ProduktBewertungen

7.3.5 Praktische Design-Guidelines

Commands verwenden für:

Events verwenden für:

Queries verwenden für:

7.3.6 Message-Design-Checkliste

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.