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?