Zwei Unternehmensintegrationsmuster sind die Befehlsnachricht und die Ereignismeldung . Ich arbeite an einem System, in dem wir Messaging nicht nur zur Integration in andere Systeme, sondern auch zur internen Kommunikation zwischen Diensten verwenden. Es soll ein letztendlich konsistentes System sein, und die Dienste sollen einander nicht kennen (mit Ausnahme einiger spezieller Dienste). Aus diesem Grund versuchen wir, Dinge zu vermeiden, die sich wie Remoteprozeduraufrufe (RPC oder RPI) anfühlen . Wir haben ein bus- und nachrichtenorientiertes Middleware-System, und alle Nachrichten werden gesendet.
Wir neigen dazu, unsere Botschaften als Ereignisse zu bezeichnen, dh als eine Phrase in der Vergangenheit, die perfekt ist, z PurchaseOrderShipped
. Die Ereignisse werden jedoch häufig nur hinzugefügt, wenn einige andere Dienste über sie Bescheid wissen müssen, und am Anfang kümmert sich häufig nur ein Dienst darum. Darüber hinaus gibt dieser Dienst manchmal ein Ereignis aus, das vom ersten Dienst abgehört wird. Wenn ich also die Interaktion grafisch darstellen würde, würde sie dem Diagramm für die Befehlsnachricht im obigen Link (oder sogar dem RPC-Diagramm) viel ähnlicher sein als dem für die Ereignismeldung, obwohl dies wiederum nicht tatsächlich implementiert ist Direktnachrichten, aber auf einem Bus gesendet. Fügen Sie dazu die Tatsache hinzu, dass ich kürzlich einige Nachrichten gesehen habe, die als Befehle benannt wurden, dh eine Phrase im Imperativ, z BillShippedPurchaseOrder
.
Das Seltsame ist, dass sich die Namen der Nachrichten und die Art und Weise, wie sie fließen, nicht dadurch ändern, ob sie als Ereignis oder als Befehl benannt werden. Wie kann man also bestimmen, ob etwas eine Befehlsnachricht oder ein Ereignis sein soll? Ist dies nur ein Unterschied zwischen Semantik und Benennung oder gibt es einen tatsächlichen Implementierungsunterschied zwischen Befehls- und Ereignismeldungen? Bedeutet das, dass alle unsere Nachrichten gesendet werden, dass keine von ihnen wirklich Befehlsnachrichten sind?
request for information
Funktionen? Es scheint natürlich, so etwas wiegetUserInfo(uid)
eine Befehlsnachricht zu verwenden, die eine Antwort erwartet. Ich weiß, dass Befehlsnachrichten die Kopplung einführen, aber leider sehe ich in diesem Fall nicht, wie sie mit Ereignismeldungen implementiert werden sollen. Oder ist es in Ordnung, sich bei solchen Gelegenheiten an Befehlsnachrichten zu halten?CancelPolicyRequest
Nachricht, die ein Befehl ist. Der andere Ansatz verwendet zwei Ereignismeldungen, nämlichInvoicePastDueNotification
undPolicyCancelledNotification
. Ich frage mich also, ob es möglich ist, Befehle wiegetUserInfo(uid)
den Stil von Ereignismeldungen zu ändern und wie ich das tun soll.Action
mit dem Befehl verbundenen ausführen . Einem Befehl sind zwei Schritte zugeordnet. 1) Wird der Befehl benötigt (z. B. Richtlinie abgelaufen) und 2) Führen Sie den Befehl aus (z. B. Abbrechen der Richtlinie). Wenn dasActor
bestimmt, ob der Befehl benötigt wird UND ausgeführt werden kann, kann esActor
Ereignismeldungen senden. Andernfalls ist zum Senden eines Befehlsereignisses alles erforderlich, was bestimmt, dass der Befehl benötigt wird.Eine Ereignismeldung ist gerade passiert. Sie benachrichtigen über das gerade eingetretene Ereignis.
Eine Befehlsnachricht ist eine Nachricht, die erwartet, dass etwas getan wird. Es kann eine Antwort erwarten oder nicht.
Wann zu verwenden ist, worauf es bei der Kopplung ankommt, und der Unterschied wird sich erst im Laufe der Zeit ergeben, wenn sich die Systeme weiterentwickeln. Das Bevorzugen von Ereignissen gegenüber Befehlen führt zu einer geringeren Kopplung. Der Veranstalter kümmert sich nicht um den Verbraucher. In einem Befehlsmuster kennt der Anrufer die Existenz des Anbieters und ist daher von dieser abhängig.
Bill Poole schlägt vor, Befehlsnachrichten insgesamt zu vermeiden: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html
http://bill-poole.blogspot.com.au/
quelle