2016-05-25 8 views
2

Ich habe Zweifel hinsichtlich der besten Strategie, wie viele Listener für ein bestimmtes Domänenereignis abonniert werden können.Wie viele Listener in einem beschränkten Kontext können für ein bestimmtes Domänenereignis abonniert werden?

Angenommen, wir haben ein Domänenereignis namens UserWasCreated veröffentlicht, wenn ein neuer Benutzer im beschränkten Kontext A erstellt wird. Angenommen, wir haben einen anderen beschränkten Kontext B, der dieses Ereignis abonniert, in dem wir viele Aufgaben ausführen müssen: Senden einer E-Mail, Fortsetzen bestimmter Informationen des Benutzers und Weiterleiten der Benutzerinformationen an einen externen Dienst (dh ein CRM).

Meine Frage ist, wie viele Hörer sollte ich für das Ereignis innerhalb des gleichen begrenzten Kontext haben?

Ich habe IDDD Buch von Vernon mit nur einem Hörer pro Ereignis wie diesem UserWasCreatedListener gesehen. Aber dieser Zuhörer hat nur eine spezifische Verantwortung, während in meinem Beispiel verschiedene Aufgaben involviert sind.

Wäre es sinnvoll, einen Listener pro Event-Task zu haben? Also folgen wir dem Beispiel, das wir haben würden:

UserWasCreated_NotifyByEmailListener 
UserWasCreated_NotifyCrmListener 
UserWasCreated_PersistUserListener 

Wenn es sinnvoll ist, wie würden Sie diese Listener nennen? Gibt es ein Problem mit der Skalierbarkeit, weil zu viele Listener erstellt werden?

+0

Ich hätte so viele Zuhörer wie unabhängige Operationen. – plalx

Antwort

2

Die kurze Antwort auf direkten Zusammenhang, wie es viele Zuhörer (Abonnenten) für ein Ereignis sein kann: 0-N

Ich mag zwischen den folgenden Arten von Ereignissen unterscheiden:

  • Domain
  • Ereignis Sourcing-
  • Messaging (System)

Der Grund ist, dass sie unterschiedliche Bedeutungen haben und in vielen Fällen unterschiedliche Daten enthalten.

Zurück zu Ihrer Frage. Sie beschreiben einen Prozess. Ein Prozess wird typischerweise durch einen Befehl Befehl oder wie in Ihrem Fall Ereignis gestartet. Ein Verfahren kann auf zwei verschiedene Arten angetrieben:

  • Orchestrierung
  • Choreographie

Wenn Meldungen sind choreographierte sie sind sehr reaktive. Das bedeutet, dass ein Ereignis zum anderen führt. In Ihrem Fall könnten Sie haben:

  • UserCreatedEvent -> PersistUserHandler (Teilnehmer) -> UserPersistedEvent
  • UserPersistedEvent -> CrmListener (Teilnehmer) -> CrmUserCreatedEvent
  • CrmUserCreatedEvent -> EmailNotifier (Teilnehmer) -> UserNotifiedEvent

Diese funktionieren in Ordnung, wenn es sich um einen eher einfachen sequentiellen Ablauf handelt.Wenn Sie Benutzereingriffe benötigen, z. B. das Überprüfen von Elementen oder die parallele Verarbeitung, werden die Dinge oft haarig.

Orchestraion, auf der anderen Seite, macht die Verwendung eines Prozess-Manager, die den Zustand des Prozesses hält und interagiert mit den verschiedenen Atom Dienstleistungen.

In Ihrem Fall könnten Sie eine UserRegistrationProcess haben, die bei Bedarf instanziiert werden würde. In Ihrem Fall vielleicht auf die Benutzererstellung. Ein anderer Ansatz ist es, den Prozess zu starten und es die Benutzererstellung enthalten. Ihre UserRegistrationProcess wäre der Abonnent der verschiedenen Veranstaltungen. Aber statt der verschiedenen Listener reagieren auf beliebige Ereignisse sie nur die entsprechenden Befehle.

  • Prozess starten
  • Prozess sendet CreatedUserCommand zum UserEndpoint (BC)
  • Prozess empfängt UserCreatedEvent vom UserEndpoint (BC)
  • Prozess sendet CreateCrmUserCommand zum CrmEndpoint (BC)
  • Prozess empfängt CrmUserCreatedEvent aus dem CrmEndpoint (BC)
  • Process sendet die SendEMailCommand an den EMailEndpoint (Infrastruktur) Process receives the EMailSentEvent` Fromt die EMailEndpoint (Infrastruktur)
  • Prozess beenden

Auf diese Weise wird die Prozessschicht einen beschränkten Kontext in seinem eigenen Recht wird.

Ich bevorzuge Orchestrierung, da Sie immer den Fortschritt eines Prozesses sehen können.