Cqrs 事件源命令或来自外部系统的事件?

Cqrs 事件源命令或来自外部系统的事件?,cqrs,event-sourcing,Cqrs,Event Sourcing,在大多数情况下,我理解CQRS+ES系统中命令和事件之间的区别。然而,有一种情况我无法理解 假设我正在构建一个个人财务跟踪系统,用户可以在其中输入借项/贷项。显然,这些都是命令,一旦它们被验证,域模型就会得到更新并发布事件。但是,假设信用/借记信息也直接来自外部系统,例如,用户的花店发送一条消息,表示他已向用户的信用卡收取了母亲节定期送货的费用。在这种情况下,消息似乎是一个事件(费用已经发生),但消息可能格式不正确,将被拒绝。那么这真的是命令吗?但是需要有一种发送ACK/NACK的方法,这里不是

在大多数情况下,我理解CQRS+ES系统中命令和事件之间的区别。然而,有一种情况我无法理解

假设我正在构建一个个人财务跟踪系统,用户可以在其中输入借项/贷项。显然,这些都是命令,一旦它们被验证,域模型就会得到更新并发布事件。但是,假设信用/借记信息也直接来自外部系统,例如,用户的花店发送一条消息,表示他已向用户的信用卡收取了母亲节定期送货的费用。在这种情况下,消息似乎是一个事件(费用已经发生),但消息可能格式不正确,将被拒绝。那么这真的是命令吗?但是需要有一种发送ACK/NACK的方法,这里不是这种情况(花商只在知道发生了借记后才发送消息)


编辑:只是澄清一下,我不是说外部系统知道我的事件和/或命令。我有一个组件,它从外部系统接收数据,然后发布事件或发送命令。问题是,我的组件应该使用哪种事件或命令?

这是有界上下文的完美示例

在表示相同或业务流程步骤的另一个系统(或有界上下文)中发生的事件不应视为在接收系统中发生的事件

Florist系统借记事件的结构可能与财务跟踪系统中发生的借记事件不同

为了解决这个问题,我将有一个端点来监听Florist系统的事件,然后我会让财务跟踪系统根据事件中的信息发出一个命令,如果需要的话,可以将它与财务跟踪系统中的信息结合起来。如果发生这种情况,可以将其视为财务跟踪系统的客户端,或者甚至可以将其视为“域服务”

在这种特殊情况下,来自Florist系统的事件会带来Florist系统中发生的事务的信息(有界上下文)。我不会在域服务中做出任何决策,但会向财务跟踪系统域发出一个命令,在该域中进行决策并可能发出财务跟踪系统事件。如果Florist系统事件在财务跟踪系统中出现错误,您可能不想以请求/响应或确认/确认的方式告知Florist系统。该活动是由花店发布的,如果您实现类似的功能,您将打破消息传递模式。您的消息传递基础结构应允许您重试消息,甚至修复接收代码,并使用新代码重试消息

但是,如果您确实需要传回Florist bounded上下文,Florist系统可以订阅来自财务跟踪系统的事件,以确定交易是否成功处理。只有在主系统决定是否可能发生交易时,才需要这样做

在这种情况下,您描述的财务跟踪系统更像是一个交易日志,您唯一需要做的是不要将花店事件视为财务跟踪系统事件。在发出导致财务跟踪系统事件的命令之间放置一些内容

编辑:


作为对编辑的响应。您接收的组件应该向财务跟踪系统域发送命令,该域反过来将发出事件(与往常一样)

我发现这个问题的时候也在想同样的事情

我喜欢米凯尔的回答,并投了赞成票。然而,我在DDD/CQRS论坛上发现了另一个答案,它采用了不同的方法,所以我想我会在这里为其他正在寻找答案的人发布它

关于跟踪外部状态的类似问题:

在大多数库存系统中,没有命令

或者解释一下:

专门跟踪外部状态的系统将没有命令

让我们回顾并思考您的系统可能如何基于此想法发展(假设您不是为自己构建):

  • 您决定创建一个个人财务跟踪器,该跟踪器记录外部世界的交易、显示图表、汇总总数等
  • 因为事件用于跟踪状态更改,而不是命令,所以需要记录这些更改。您还可以在事件处理程序中编写投影,以便将事件聚合为总计和图形数据点
  • 然后你就有了用户。他们对该应用程序赞不绝口,但使用率仍然很低。深入挖掘之后,你会发现他们仍然使用其他应用程序来跟踪财务状况,比如说,当地的信用卡商店没有针对母亲节贺卡的API,他们想将一笔外部交易“拆分”为多笔,他们的银行没有在线访问,他们想跟踪现金等等
  • 因此,您可以添加用户输入的事务。您可以通过添加跟踪用户输入的事务的命令来完成此操作。现在我们的系统和你的问题一样
请注意,此变体同时接受命令和事件。您不会因为现在允许用户更改内容而返回并将所有现有事件转换为命令。相反,您的系统可以接受外部事务事件、用于用户输入的事务和事务更正的命令(创建修改内部状态的事件)以及将这些内部和外部事件组合在一起以在应用程序中显示的投影


不过我很好奇。事后看来,被接受的答案最终是一个好方法吗?或者像格雷格建议的那样直接从花店记录和处理事件会更好吗?

谢谢米凯尔,这是一个很好的答案。有界上下文是我所缺少的。