Как определить, должно ли сообщение быть командным сообщением или сообщением о событии?

11

Два корпоративных шаблона интеграции - это командное сообщение и сообщение о событии . Я работаю над системой, в которой мы используем обмен сообщениями не только для интеграции с другими системами, но и для внутренней связи между службами. Предполагается, что это в конечном итоге согласованная система, а службы должны быть невежественными друг в друге (за исключением пары специализированных служб). Поэтому мы стараемся избегать вещей, которые напоминают удаленные вызовы процедур (RPC или RPI). У нас есть система промежуточного программного обеспечения, ориентированная на шины и сообщения, и все сообщения передаются в эфир.

Мы склонны называть наши сообщения как события, то есть как фразу в прошлом совершенном, например PurchaseOrderShipped. Однако события часто добавляются только тогда, когда о них должны знать некоторые другие службы, и в начале часто заботится только одна служба. Более того, иногда этот сервис в результате генерирует событие, которое прослушивается первым сервисом. Таким образом, если бы я планировал взаимодействие, он выглядел бы гораздо больше как диаграмма для командного сообщения по ссылке выше (или даже диаграмма RPC), чем диаграмма для сообщения о событии, хотя, опять же, это на самом деле не реализовано с прямой обмен сообщениями, но трансляция на автобусе. Добавьте к этому тот факт, что я недавно видел добавление некоторых сообщений, которые называются командами, то есть фраза в императиве, например BillShippedPurchaseOrder.

Странно то, что имена сообщений и способ их передачи не изменяются в зависимости от того, названо ли оно как событие или как команда. Так как же определить, должно ли что-то быть командным сообщением или событием? Является ли это просто различием семантики и именования, или есть фактическая разница реализации между командами и сообщениями о событиях? Учитывая, что все наши сообщения передаются, означает ли это, что ни одно из них не является действительно командным сообщением?

Kazark
источник

Ответы:

11

Существует тонкая, но важная разница между командами и событиями. Команда имеет презумпцию ответа, в то время как событие не предполагает ответа, это просто утверждение.

Чтобы быть менее абстрактным:

ShipOrderявляется командой, и отправитель ShipOrder, скорее всего, ожидает какой-то ответ.
OrderShippedявляется декларацией, и отправитель вряд ли ожидает ответ, поскольку GoodJob!в данном примере это бесполезный ответ.

Если вы разрабатываете свои системы так, чтобы ожидать только сообщений о событиях, то для системы не обязательно имеет значение, что вы называете сообщениями. Разработчики могут запутаться в названии сообщения, но системы будут реагировать очень хорошо, независимо от того, с каким соглашением вы будете следовать.

Но не похоже, что ваши коллеги-разработчики следуют модели сообщений только для событий. Если службы ожидают ответов на «сообщения о событиях», которые они отправляют, то они действительно отправляют командные сообщения. Это не имеет большого значения, и я могу вспомнить много случаев, когда требовались бы такие команды, как запросы информации. Но у вас будет семантическая головная боль, если вы ожидаете видеть только сообщения о событиях.

Широковещательные сообщения на самом деле не влияют на то, является ли сообщение командой или событием. Как правило, вы не транслируете команды, поскольку они дублируют усилия. Но нечего сказать, что ты не мог. Ранние сетевые протоколы передавали каждый пакет, и получатели должны были быть достаточно умными, чтобы знать, когда их игнорировать.Сообщения пакеты, которые не принадлежат им.


источник
Как вы реализуете request for informationфункции? Кажется естественным использовать нечто вроде getUserInfo(uid)командного сообщения, ожидающего ответа. Я знаю, что командные сообщения вводят связь, но, к сожалению, в этом случае я не вижу, как реализовать это с сообщениями о событиях. Или это просто хорошо придерживаться командных сообщений в некоторых случаях, как это?
du369
@ du369 Извините, но я не совсем понимаю ваш вопрос. Похоже, вы пытаетесь создать команду, но используете события?
Да, в значительной степени это. В ссылке, приведенной в ответе Ли, одна и та же функциональность реализована двумя различными способами. Один использует CancelPolicyRequestсообщение, которое является командой. Другой подход использует два сообщения о событиях, а именно InvoicePastDueNotificationи PolicyCancelledNotification. Поэтому я задаюсь вопросом, можно ли изменить команды, например getUserInfo(uid)стиль сообщений о событиях, и как я должен это делать.
du369
1
@ du369 Что-то, где-то должен выполнить Actionсвязанный с командой. Есть два шага, связанных с командой. 1) Требуется ли команда (например, истек срок действия политики), и 2) выполнить команду (например, отменить политику). Если тот, Actorкоторый определяет, нужна ли команда и может ли она выполняться, Actorможет отправлять сообщения о событиях. В противном случае все, что определяет, нужна ли команда, требуется для отправки события команды.
5

Сообщение о событии - это то, что только что произошло. Вы уведомляете о событии, которое только что произошло.

Командное сообщение - это сообщение, которое ожидает, что что-то будет сделано. Это может или не может ожидать ответа.

Когда использовать то, что сводится к соединению, и разница будет проявляться только с течением времени по мере развития систем. Пользуясь событиями над командами, вы получаете меньше связей Эмитент мероприятия не заботится о потребителе. В шаблоне команд вызывающий знает и поэтому зависит от существования поставщика.

Билл Пул предлагает избегать командных сообщений все вместе: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

http://bill-poole.blogspot.com.au/

Ли Симпсон
источник
Ли, спасибо за ваш ответ, но я понимаю теорию, лежащую в основе определения каждого. Мой вопрос состоит в том, как применить это в реальной жизни - когда сообщить, что что-то произошло, что часто приводит к тому, что что-то делается, и когда просить, чтобы что-то было сделано.
Казарк
Я думаю, что это сводится к соединению, и разница будет проявляться только со временем по мере развития систем. Пользуясь событиями над командами, вы получаете меньше связей. Эмитент мероприятия не заботится о потребителе. В шаблоне команд вызывающий знает и поэтому зависит от существования поставщика. Вы читали статьи Билла Пула?
Ли Симпсон
Ли, спасибо, это полезно; на самом деле, я предлагаю вам отредактировать контент из вашего комментария в свой ответ, включая ссылку на статьи Poole (которую я не уверен, что прочитал).
Казарк,