如何确定消息是命令消息还是事件消息?


11

两种企业集成模式是命令消息事件消息。我正在开发一个系统,在该系统中,我们不仅使用消息传递与其他系统集成,还使用服务之间的内部通信。它应该是一个最终一致的系统,并且服务应该彼此一无所知(几个特殊用途的服务除外)。因此,我们尽量避免感觉像是远程过程调用(RPC或RPI)。我们有一个面向总线和面向消息的中间件系统,并且所有消息都被广播。

我们倾向于将消息命名为事件,即过去完美的短语,例如PurchaseOrderShipped。但是,通常仅在某些其他服务需要了解事件时才添加事件,并且一开始通常只关心一个服务。而且,有时该服务会发出一个结果,该事件会被第一个服务侦听。因此,如果我要绘制交互关系图,则它看起来更像是上面链接中的命令消息图(甚至是RPC图),而不是事件消息图,尽管这实际上并没有实现直接消息传递,但在公交车上广播。另外,我最近看到有一些消息被添加为命令,即命令中的短语,例如BillShippedPurchaseOrder

奇怪的是,消息的名称及其传递方式不会通过将其命名为事件还是命令而改变。那么,如何确定某个东西应该是命令消息还是事件?这仅仅是语义和命名的区别,还是命令和事件消息之间的实际实现区别?既然我们所有的消息都是广播的,那是否意味着没有一个是真正的命令消息?

Answers:


11

命令和事件之间存在细微但重要的区别。命令具有响应的假定,而事件并不假定响应,它仅是一条语句。

为了不那么抽象:

ShipOrder是命令,发件人ShipOrder可能会期望某种响应。
OrderShipped是一个声明,发件人不太可能期望得到响应,GoodJob!在此示例中,它是无用的响应。

如果您将系统设计为仅接收事件消息,则对系统设计的调用消息不一定重要。 开发人员可能会对消息的名称感到困惑,但是无论您遵循什么约定来命名事物,系统都会很好地响应。

但这听起来并不像您的开发人员在遵循纯事件消息模型。如果服务期望它们正在发送对“事件消息”的响应,那么它们实际上就是在发出命令消息。这没什么大不了的,我可以想到很多情况下都需要诸如信息请求之类的命令。但是,如果您只希望看到事件消息,那么您将在语义上头疼。

广播消息并不会真正影响消息是命令还是事件。通常,您不会广播命令,因为它会重复工作。但是没有什么可以说的。早期的网络协议广播每个数据包,并且接收者必须足够智能,才能知道何时忽略讯息 不属于他们的数据包。


您如何实现request for information功能?使用类似这样getUserInfo(uid)的命令消息是很自然的,它期望响应。我知道命令消息会引入耦合,但是遗憾的是,在这种情况下,我看不到如何使用事件消息来实现耦合。还是在某些情况下坚持使用命令消息就可以了?
du369

@ du369抱歉,但我不太关注您的问题。听起来您正在尝试创建命令,但是正在使用事件?

是的,差不多。在Lee的答案中提供的链接中,以两种不同的方式实现了相同的功能。一种是使用CancelPolicyRequest消息,它是命令。另一种方法利用两个事件消息,即InvoicePastDueNotificationPolicyCancelledNotification。所以我想知道是否有可能破坏诸如getUserInfo(uid)事件消息样式之类的命令,以及我该怎么做。
du369

1
@ du369必须在某处执行Action与命令关联的操作。与命令相关联的两个步骤。1)是否需要该命令(例如策略已过期),以及2)执行该命令(例如取消策略)。如果Actor可以确定是否需要该命令并且可以执行,则Actor可以发送事件消息。否则,发送命令事件需要任何确定需要命令的条件。

5

事件消息是刚刚发生的事情。您正在通知刚刚发生的事件。

命令消息是期望完成某件事的消息。它可能会或可能不会期望响应。

什么时候使用归结于耦合的东西,差异只会随着系统的发展而逐渐显现。通过命令偏爱事件可以减少耦合。事件的发出者并不关心消费者。在命令模式中,调用者知道并因此依赖于提供者的存在。

Bill Poole建议同时避免使用命令消息:http : //bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

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


Lee,谢谢您的回答,但我确实了解每个定义背后的理论。我的问题是如何在现实生活中应用它-何时通知已发生某事,这通常会导致某事完成,以及何时要求某事完成。
卡扎尔克2015年

我认为可以归结为耦合,并且随着系统的发展,差异只会随着时间的推移而显现。通过命令偏爱事件可以减少耦合。事件的发出者并不关心消费者。在命令模式中,调用者知道并因此依赖于提供者的存在。您阅读过Bill Poole的文章吗?
李·辛普森

李,谢谢,这很有帮助;实际上,我建议您将评论中的内容编辑成答案,包括指向Poole文章的链接(我不确定我已阅读过该文章)。
卡扎尔克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.