In most cases I understand the distinction between a command and an event in a CQRS + ES system. However, there is one situation that I can't figure out.
Suppose I am building a personal finance tracking system, where a user can enter debits/credits. Clearly these are commands, and once they are validated the domain model gets updated and an event is published. However, suppose that credit/debit information also comes directly from external systems e.g. the user's florist sends a message that he has charged the user's credit card for his recurring Mother's Day delivery. In this case the message seems like it is an event (the charge has already occurred), but it is possible that the message is malformed and will be rejected. So is it really a command? But then there needs be a way to send an ACK/NACK, which isn't the case here (the florist only sends the message once he knows that the debit has taken place).
EDIT: Just to clarify, I'm not talking about the external system knowing anything about my events and/or commands. I have a component that receives data from the external system and then has to publish an event or send a command. The question is, which of event or command should my component use?
这是有界的上下文的一个很好的例子。
表示相同或业务过程步骤内所出现的另一个系统(或界定上下文)的情况下,不应该被视为已发生在接收系统中的事件。
花店系统借记事件可能具有不同的结构,会比发生在财务跟踪系统的借记事件。
为了解决这个问题我会说会听花店系统事件的终点,并从我会让财务跟踪系统问题,基于事件的信息的命令,也许,如果需要在财务跟踪系统的信息结合起来。 当发生这种情况可以认为是一个客户端向财务追踪系统或者甚至一个“域服务”,如果你会的。
在这个特定的情况下,从花店系统中的事件与发生了花店系统(界上下文)事务的信息用武之地。 我不会让域中服务的任何决定,而是发出命令,其中决定发生和财务跟踪系统事件可能发出的财务跟踪系统域。 如果花店系统事件出现在财务跟踪系统畸形,你可能不想告诉了花店系统中的请求/响应或ACK / NACK的方式。 本次活动从花店公布,如果实现类似的东西,你会打破消息模式。 你的消息基础设施应该让你重试的消息,甚至固定接收代码与新代码重试的消息。
但是,如果你真的需要沟通回花店界背景下,花店系统可以预订从财务跟踪系统事件,以找出交易是否已成功处理。 如果主系统是决定是否有可能发生或不交易,只会是必要的。
在这种情况下你所描述的财务跟踪系统更是一个事务日志的,你应该做的唯一的事情就是不要把花店事件,财务跟踪系统事件。 把东西之间的问题导致财务跟踪系统活动命令。
编辑:
至于你编辑的响应。 您接收组件应该发送命令到这反过来会发出事件(像往常一样)财务跟踪系统域。
我发现这个问题,而想知道同样的事情。
我喜欢的Mikael的回答和upvoted它。 然而,我发现在DDD / CQRS论坛,采用不同的方法的另一个答案,所以想我会在这里发布了其他人谁正在寻找了。
下面是Greg Young的报价关于跟踪外部状态类似的问题:
在大多数库存系统没有命令。
或者套用:
是专门跟踪外部状态的系统不会有任何命令。
让我们倒带想通过您的系统可能会如何发展基于这种思想(让我们还假设你没有建立它自己):
- 你决定创建一个从外面的世界记录交易的个人理财追踪器,显示图表,汇总数据等。
- 由于事件是跟踪状态变化,而不是命令,你记录这些。 您也写在事件处理程序推算聚集事件成总数和图形数据点。
- 然后你得到的用户。 他们称赞的应用程序,但使用率仍然偏低。 更深的挖掘后,你会发现,他们仍然使用其他应用来跟踪资金的时候,比方说,有本地卡商店经常性的母亲节卡片没有API,他们希望“分裂”外部事务分成多个,他们的银行有没有在线访问,他们要跟踪现金等
- 所以,你添加用户输入的交易。 您可以通过添加跟踪用户输入的交易命令这样做。 现在,我们在同一个系统你的问题。
请注意,这个变体同时接受命令和事件。 你不会回去,所有现有的事件转换为命令,只是因为你现在允许用户改变的事情。 相反,你必须接受外部交易活动,对用户输入的交易和交易更正(其创建修改内部状态的事件),并预测命令这些内部和外部事件的应用结合起来,显示的系统。
我很好奇,虽然。 现在回想起来,并接受的答案最终会是一个很好的方法吗? 或将记录并处理来自花店事件直接像格雷格建议是更好吗?