Gran parte della confusione tra "passaggio di messaggi" e "basato sugli eventi" ha a che fare con i dettagli architettonici e di implementazione. Ho visto (e scritto) sistemi guidati da eventi che utilizzano effettivamente messaggi forniti dal sistema operativo per la loro implementazione. Immagino che ti riferisci davvero alle idee architettoniche.
Come molte persone hanno già sottolineato "passaggio di messaggi" e "eventi basati" non sono termini abbastanza buoni per evitare ambiguità.
Quali sono i meriti relativi di un sistema di "trasmissione messaggi" rispetto a un sistema "basato su eventi".
Passaggio dei messaggi
Inizierò supponendo che quando dici un sistema di "passaggio di messaggi", stai parlando di un sistema in cui un oggetto spende un messaggio a un altro oggetto specifico. Quando penso a un sistema basato su questo paradigma, penso più in generale a un sistema in cui un oggetto che rileva qualcosa sa chi deve essere raccontato su qualcosa. (Non sto specificando come lo sa, solo che lo sa.)
Questo tipo di architettura è ottimo per i sistemi in cui produttori e consumatori sono noti. O il produttore di un messaggio sa chi deve riceverlo o il consumatore deve sapere da chi ricevere il messaggio.
Se stai scrivendo un'applicazione bancaria, ci si aspetterebbe davvero che tu voglia sapere a chi stai inviando le tue transazioni e da chi provengono.
Basato su eventi
L'altro sistema a cui credo tu stia pensando quando dici che un sistema "basato sugli eventi" è quello in cui un oggetto genera un "evento" senza sapere chi (se qualcuno) risponderà ad esso.
Questo tipo di architettura basata sugli eventi è molto utile per i sistemi in cui il produttore non si preoccupa di chi consuma l'evento o in cui al consumatore non importa davvero chi ha prodotto l'evento.
In generale, questi sistemi sono ottimi dove non si conosce la relazione tra consumatori e produttori e dove ci si aspetta che la relazione sia dinamica.
Un sistema in cui l'ho usato era un sistema in cui l'applicazione era in realtà composta da moduli (plug-in) configurati dinamicamente che venivano caricati in fase di esecuzione. Quando un modulo veniva caricato, si registrava per gli eventi a cui teneva. Il risultato fu un sistema in cui era molto facile estendere la funzionalità.
Ad esempio, supponiamo che la condizione A abbia generato l'evento EA che normalmente ha causato la risposta RA. L'oggetto che ha causato la risposta RA si è semplicemente registrato per ricevere l'evento EA e ha agito su di esso quando è arrivato. Ora, supponiamo di voler aggiungere una nuova risposta a EA, chiamata RA_1. Per fare ciò, aggiungiamo semplicemente un nuovo oggetto che cerca EA e genera una risposta RA_1.
Ecco un paio di esempi (usando la tua terminologia):
- "messaggio che passa" : il tuo capo ti dice di compilare il tuo foglio presenze.
- "event driven" : il segretario del dipartimento invia un'email a tutti ricordando loro che i loro fogli di lavoro sono in scadenza oggi.