Gran parte de la confusión entre "pasar mensajes" y "basado en eventos" tiene que ver con los detalles arquitectónicos versus los de implementación. He visto (y escrito) sistemas controlados por eventos que realmente usan mensajes provistos por el sistema operativo para su implementación. Supongo que realmente te estás refiriendo a ideas arquitectónicas.
Como muchas personas ya han señalado, "pasar mensajes" y "basados en eventos" no son términos realmente buenos para evitar la ambigüedad.
¿Cuáles son los méritos relativos de un sistema de "transmisión de mensajes" frente a un sistema "basado en eventos"?
Paso de mensajes
Comenzaré por adivinar que cuando dices un sistema de "transmisión de mensajes", estás hablando de un sistema en el que un objeto pasa un mensaje a otro objeto específico. Cuando pienso en un sistema basado en este paradigma, generalmente pienso en un sistema en el que un objeto que detecta algo sabe quién necesita que se le informe sobre algo. (No estoy especificando cómo sabe, solo que sabe).
Este tipo de arquitectura es muy buena para sistemas donde los productores y consumidores son bien conocidos. El productor de un mensaje sabe quién debe recibirlo o el consumidor debe saber de quién obtener el mensaje.
Si está escribiendo una solicitud bancaria, uno esperaría que realmente quiera saber a quién está enviando sus transacciones y de quién provienen.
Basado en eventos
El otro sistema en el que creo que está pensando cuando dice que un sistema "basado en eventos" es aquel en el que un objeto genera un "evento" sin saber quién (si alguien) responderá.
Este tipo de arquitectura basada en eventos es muy buena para sistemas en los que al productor no le importa quién consume el evento o donde al consumidor realmente no le importa quién produjo el evento.
En general, estos sistemas son excelentes cuando no conoce la relación entre consumidores y productores, y donde espera que la relación sea dinámica.
Un sistema en el que he usado esto fue un sistema en el que la aplicación estaba compuesta de módulos configurados dinámicamente (complementos) que se cargaban en tiempo de ejecución. Cuando se cargaba un módulo, se registraba para los eventos que le interesaban. El resultado fue un sistema en el que era muy fácil ampliar la funcionalidad.
Por ejemplo, digamos que la condición A provocó un evento EA que normalmente causó la respuesta RA. El objeto que causó la respuesta RA simplemente se registró para recibir el evento EA y actuó sobre él cuando llegó. Ahora, supongamos que queremos agregar una nueva respuesta a EA, llamada RA_1. Para hacer esto, simplemente agregamos un nuevo objeto que busca EA y genera la respuesta RA_1.
Aquí hay un par de ejemplos (usando su terminología):
- "pasar mensaje" : su jefe le dice que complete su hoja de tiempo.
- "impulsado por el evento" : la secretaria del departamento envía un correo electrónico a todos para recordarles que sus hojas de tiempo deben presentarse hoy.