Большая часть путаницы между «передачей сообщений» и «на основе событий» связана с деталями архитектуры и реализации. Я видел (и писал) управляемые событиями системы, которые фактически используют предоставленные ОС сообщения для их реализации. Я предполагаю, что вы действительно имеете в виду архитектурные идеи.
Поскольку многие люди уже отметили, что «передача сообщений» и «на основе событий» не являются достаточно хорошими терминами, чтобы избежать двусмысленности.
Каковы относительные достоинства системы «передачи сообщений» по сравнению с системой «на основе событий».
Передача сообщений
Я начну с предположения, что когда вы говорите «система передачи сообщений», вы говорите о системе, в которой один объект передает сообщение определенному другому объекту. Когда я думаю о системе, основанной на этой парадигме, я в целом имею в виду систему, в которой объект, который обнаруживает что-то, знает, кому нужно что-то сказать. (Я не уточняю, как он знает, просто он знает.)
Этот тип архитектуры очень хорош для систем, где производители и потребители хорошо известны. Либо производитель сообщения знает, кто должен его получить, либо потребитель должен знать, от кого получить сообщение.
Если вы пишете банковское приложение, можно ожидать, что вы действительно хотите знать, кому вы отправляете свои транзакции и от кого они приходят.
Основанный на событии
Другая система, о которой я думаю, вы думаете о том, когда вы говорите, что система, основанная на событиях, - это система, в которой объект вызывает «событие», не зная, кто (если кто-то) ответит на него.
Этот тип архитектуры, управляемой событиями, очень хорош для систем, где производитель не заботится о том, кто потребляет событие, или где потребитель не заботится о том, кто произвел событие.
В целом, эти системы хороши там, где вы не знаете взаимоотношений между потребителями и производителями, и где вы ожидаете, что отношения будут динамичными.
Одной из систем, в которой я использовал это, была система, в которой приложение было фактически составлено из динамически настроенных модулей (плагинов), которые были загружены во время выполнения. Когда модуль был загружен, он регистрировался на события, о которых заботился. Результатом стала система, в которой было очень легко расширить функциональность.
Например, скажем, условие A вызвало событие EA, которое обычно вызывало ответ RA. Объект, вызвавший ответ RA, просто зарегистрировался для получения события EA и действовал на него, когда он прибыл. Теперь предположим, что мы хотим добавить в EA новый ответ, который называется RA_1. Для этого мы просто добавляем новый объект, который ищет советника и генерирует ответ RA_1.
Вот пара примеров (используя вашу терминологию):
- «передача сообщений» : ваш босс говорит вам, чтобы заполнить ваше расписание.
- «управляемый событиями» : секретарь департамента рассылает электронное письмо всем, напоминая им о том, что их расписание должно быть сегодня.