Come determinare se un messaggio dovrebbe essere un messaggio di comando o un messaggio di evento?

8

Due modelli di integrazione aziendale sono il messaggio di comando e messaggio di evento . Sto lavorando a un sistema in cui utilizziamo la messaggistica non solo per l'integrazione con altri sistemi, ma per la comunicazione interna tra i servizi. Dovrebbe essere un sistema alla fine coerente , e i servizi dovrebbero essere ignoranti l'uno dell'altro (con l'eccezione di una coppia speciale servizi specifici). Come tale, cerchiamo di evitare cose che si sentono come chiamate di procedura remota (RPC o RPI). Abbiamo un sistema di middleware basato su bus e messaggi e tutti i messaggi sono trasmessi.

Tendiamo a dare un nome ai nostri messaggi come eventi, cioè come una frase nel passato perfetto, ad es. %codice%. Tuttavia, gli eventi vengono spesso aggiunti solo quando alcuni altri servizi devono conoscerli e all'inizio, spesso, solo un servizio si prende cura di loro. Inoltre, a volte quel servizio emette un evento come risultato, che viene ascoltato dal primo servizio. Quindi, se dovessi disegnare l'interazione, sembrerebbe molto più simile al diagramma del messaggio di comando nel link sopra (o anche al diagramma RPC) rispetto a quello per il messaggio dell'evento, sebbene, ancora una volta, questo non sia effettivamente implementato con messaggistica diretta ma trasmessa su un bus. Aggiungete a ciò il fatto che di recente ho visto alcuni messaggi aggiunti che sono nominati come comandi, cioè una frase nell'imperativo, ad es. PurchaseOrderShipped .

La cosa strana è che i nomi dei messaggi e il modo in cui fluiscono non cambiano se è denominato come evento o come comando. Quindi, come si determina se qualcosa dovrebbe essere un messaggio di comando o un evento? Questa è solo una differenza di semantica e denominazione, oppure esiste una differenza di implementazione effettiva tra i messaggi di comando e di evento? Dato che tutti i nostri messaggi sono trasmessi, vuol dire che nessuno di loro è veramente un messaggio di comando?

    
posta Kazark 12.02.2014 - 23:06
fonte

2 risposte

8

C'è una sottile, ma importante differenza tra comandi ed eventi. Un comando ha una presunzione di risposta mentre un evento non presume una risposta, è semplicemente una dichiarazione.

Per essere meno astratto:

ShipOrder è un comando e il mittente di ShipOrder probabilmente aspetterà una risposta di qualche tipo.
OrderShipped è una dichiarazione e il mittente non si aspetta una risposta in quanto GoodJob! è inutile risposta in questo esempio.

Se stai progettando i tuoi sistemi in modo che si aspettino solo messaggi di eventi, allora non è necessariamente importante per il design del sistema ciò che chiami i messaggi. Gli sviluppatori potrebbero essere confusi dal nome di un messaggio, ma i sistemi risponderanno bene, indipendentemente dalla convenzione che segui per nominare le cose.

Ma non sembra che i tuoi colleghi sviluppatori stiano seguendo il modello del messaggio di solo evento. Se i servizi si aspettano risposte ai "messaggi di evento" che stanno inviando, allora stanno davvero inviando messaggi di comando. Non è un grosso problema, e posso pensare a molti casi in cui sarebbero necessari comandi come richieste di informazioni. Ma avrai un mal di testa semantico se ti aspetti di vedere solo i messaggi degli eventi.

La trasmissione di messaggi non ha alcun impatto sul fatto che un messaggio sia un comando o un evento. In genere, non si trasmettono comandi poiché duplica lo sforzo. Ma non c'è niente da dire che non potresti. I primi protocolli di rete trasmettevano ogni pacchetto e i ricevitori dovevano essere abbastanza intelligenti da sapere quando ignorare i pacchetti messaggi che non appartenevano a loro.

    
risposta data 13.02.2014 - 00:24
fonte
3

Un messaggio di evento è qualcosa che è appena successo. Stai avvisando dell'evento appena accaduto.

Un messaggio di comando è un messaggio che si aspetta che venga fatto qualcosa. Potrebbe o meno aspettarsi una risposta.

Quando usare ciò che viene giù per l'accoppiamento e la differenza emergerà solo nel tempo man mano che i sistemi evolvono. Favorire gli eventi rispetto ai comandi risulta in un minore accoppiamento. L'emittente dell'evento non si preoccupa del consumatore. In un modello di comando il chiamante conosce ed è quindi dipendente dall'esistenza del provider.

Bill Poole suggerisce di evitare tutti i messaggi di comando: link

link

    
risposta data 07.01.2015 - 01:01
fonte