Два корпоративных шаблона интеграции - это командное сообщение и сообщение о событии . Я работаю над системой, в которой мы используем обмен сообщениями не только для интеграции с другими системами, но и для внутренней связи между службами. Предполагается, что это в конечном итоге согласованная система, а службы должны быть невежественными друг в друге (за исключением пары специализированных служб). Поэтому мы стараемся избегать вещей, которые напоминают удаленные вызовы процедур (RPC или RPI). У нас есть система промежуточного программного обеспечения, ориентированная на шины и сообщения, и все сообщения передаются в эфир.
Мы склонны называть наши сообщения как события, то есть как фразу в прошлом совершенном, например PurchaseOrderShipped
. Однако события часто добавляются только тогда, когда о них должны знать некоторые другие службы, и в начале часто заботится только одна служба. Более того, иногда этот сервис в результате генерирует событие, которое прослушивается первым сервисом. Таким образом, если бы я планировал взаимодействие, он выглядел бы гораздо больше как диаграмма для командного сообщения по ссылке выше (или даже диаграмма RPC), чем диаграмма для сообщения о событии, хотя, опять же, это на самом деле не реализовано с прямой обмен сообщениями, но трансляция на автобусе. Добавьте к этому тот факт, что я недавно видел добавление некоторых сообщений, которые называются командами, то есть фраза в императиве, например BillShippedPurchaseOrder
.
Странно то, что имена сообщений и способ их передачи не изменяются в зависимости от того, названо ли оно как событие или как команда. Так как же определить, должно ли что-то быть командным сообщением или событием? Является ли это просто различием семантики и именования, или есть фактическая разница реализации между командами и сообщениями о событиях? Учитывая, что все наши сообщения передаются, означает ли это, что ни одно из них не является действительно командным сообщением?
request for information
функции? Кажется естественным использовать нечто вродеgetUserInfo(uid)
командного сообщения, ожидающего ответа. Я знаю, что командные сообщения вводят связь, но, к сожалению, в этом случае я не вижу, как реализовать это с сообщениями о событиях. Или это просто хорошо придерживаться командных сообщений в некоторых случаях, как это?CancelPolicyRequest
сообщение, которое является командой. Другой подход использует два сообщения о событиях, а именноInvoicePastDueNotification
иPolicyCancelledNotification
. Поэтому я задаюсь вопросом, можно ли изменить команды, напримерgetUserInfo(uid)
стиль сообщений о событиях, и как я должен это делать.Action
связанный с командой. Есть два шага, связанных с командой. 1) Требуется ли команда (например, истек срок действия политики), и 2) выполнить команду (например, отменить политику). Если тот,Actor
который определяет, нужна ли команда и может ли она выполняться,Actor
может отправлять сообщения о событиях. В противном случае все, что определяет, нужна ли команда, требуется для отправки события команды.Сообщение о событии - это то, что только что произошло. Вы уведомляете о событии, которое только что произошло.
Командное сообщение - это сообщение, которое ожидает, что что-то будет сделано. Это может или не может ожидать ответа.
Когда использовать то, что сводится к соединению, и разница будет проявляться только с течением времени по мере развития систем. Пользуясь событиями над командами, вы получаете меньше связей Эмитент мероприятия не заботится о потребителе. В шаблоне команд вызывающий знает и поэтому зависит от существования поставщика.
Билл Пул предлагает избегать командных сообщений все вместе: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html
http://bill-poole.blogspot.com.au/
источник