User Tools

Site Tools


technology:multiplecommandhandling

Multiple Command Handling

Multiple Command Handling ist nichts anderes als die Ausführung mehrerer Befehle innerhalb einer einzelnen Transaktion. Die Remote Facade hat dafür neben der Methode

Apply(Command cmd)

eine weitere Methode

ApplyAllOrNone(IList<Command> cmds)

Die Remote Facade baut nun nicht eine Transaktion um jeden Befehl, sondern um alle. Sie startet eine Transaktion und ruft dann die entsprechenden Command Handler für alle Befehle auf, und beendet die Transaktion nachdem alle Befehle erfolgreich ausgeführt wurden, bzw. storniert die Transaktion im Fehlerfall.

Multiple Command Handling bürgt einige Risiken. Hauptsächlich wegen Eventual Consistency. Nehmen wir das Beispiel von Terminen, mit der Regel, dass sich zwei Termine nicht überschneiden sollen. Wenn ich nun zwei Termine an das Multiple Command Handling schicke, die sich überschneiden, würde das nie entdeckt werden. Die Prüfung auf eine Zeitüberschneidung verwendet nämlich Eventual Consistency. Wird ein Termin angelegt, wird das Read Model nach überlappenden Terminen gefragt. Termin 1 wird aber noch nicht im Read Model enthalten sein wenn Termin 2 angelegt werden soll, und somit könnte man auf diesem Weg immer zwei sich überlappende Termine anlegen.

Das ist zwar kein Beinbruch, weil man dem Anwender erklärt hat, dass die Möglichkeit von überlappenden Terminen durchaus vorhanden ist, mit einer kleinen Wahrscheinlichkeit von 0,00001% wenn zwei Anwender gleichzeitig Termine anlegen, und dass das nicht weiter schlimm ist, weil keine wichtigen Regeln verletzt wurden und PRO•M dafür Compensating Actions vorsieht1). Die Wahrscheinlichkeit von 0,00001% ist dann aber nicht mehr so klein, bei entsprechender Bedienung wäre sie 100%!

Um das Thema abzuschließen sind hier die Regeln, die eingehalten werden sollten, damit Multiple Command Handling sinnvoll und risikofrei eingesetzt werden kann:

  • mehrere Befehle immer nur für ein und dasselbe Aggregate zur gemeinsamen Bearbeitung absenden2)
  • in der Ausführung eines Befehls für ein Aggregate, z.B. wenn Regeln geprüft werden, niemals das Read Model nach Daten des Aggregates fragen3)
  • seinen gesunden Menschenverstand anwenden!
1) E-Mail Benachrichtigung damit die Überlappung aufgelöst werden kann
2) das kann die Remote Facade sogar sicher stellen, indem es die Befehle erst analysiert
3) diese sind bei Befehl n, n>1 nicht mehr aktuell. D.h. dass Eventual Consistency auch innerhalb eines einzelnen Aggregates bei mehreren Befehlen zum Problem werden kann
technology/multiplecommandhandling.txt · Last modified: 2012/10/04 12:57 by rtavassoli