2016-06-15 18 views
5

Was wäre die beste Vorgehensweise, wenn Sie über eine ereignisgesteuerte Architektur verfügen und ein Dienst, der Ereignisse abonniert, auf mehrere Ereignisse (der gleichen Art) warten muss, bevor Sie mit dem Erstellen des nächsten Ereignisses fortfahren in der Kette?Behandlung mehrerer Ereignisabhängigkeiten in ereignisgesteuerter Architektur

Ein Beispiel wäre ein Buchauftragsabwicklungsdienst, der darauf warten muss, dass jedes Buch in der Bestellung vom Lager bearbeitet wurde, bevor das Ereignis erstellt wurde, dass der Auftrag ausgewählt wurde, damit der Versanddienst (oder etwas Ähnliches) nimmt die Bestellung auf und bereitet sich auf den Versand vor.

Antwort

5

Sie können das Aggregator Muster, auch Parallel Convoy genannt, verwenden.

Im Wesentlichen müssen Sie eine Möglichkeit haben, Nachrichten zu identifizieren, die aggregiert werden müssen, und wenn der aggregierte Satz als Ganzes empfangen wurde, damit die Verarbeitung beginnen kann.

Ohne ausgehen und buying the book *, die Apache Camel Integrationsplattform Website hat einige nice resource bei der Implementierung der Aggregator-Muster. Während dies offensichtlich spezifisch für Camel ist, können Sie sehen, um was für Dinge es sich handelt.

* Disclaimer: Ich bin nicht in irgendeiner Weise mit Adison Wesley verbunden ist oder eine der Autoren des Buches ...

+0

Danke für den Vorschlag. Ich habe Zugriff auf das Buch über Safari Books Online. Sieht so aus, als ob der Aggregator genau das ist, wonach ich gesucht habe. – Patrick

12

Ein weiteres nützliches Muster neben dem Aggregator, dass Tom oben erwähnt ist a saga pattern (a mini Arbeitsablauf). Ich habe es zuvor mit Messaging-Bibliothek namens NServiceBus verwendet, um die Koordination mehrerer Nachrichten zu behandeln, die miteinander korreliert sind.

das Muster ist sehr nützlich und passt gut für lang laufende Prozesse. Auch wenn Ihre korrelierten Nachrichten unterschiedliche Nachrichten sind, wie OrderStarted, OrderLineProcessed, OrderCompleted.

+0

Guter Vorschlag. Ich habe mich damit beschäftigt, Prozesse zu behandeln, die während der Ausführung fehlschlagen könnten, so dass sie beim Neustart des Dienstes oder beim Start einer neuen Instanz abgerufen werden können. – Patrick