在大多数情况下,我了解 CQRS + ES 系统中命令和事件之间的区别。然而,有一种情况我想不通。
假设我正在构建一个个人财务跟踪系统,用户可以在其中输入借方/贷方。显然,这些是命令,一旦经过验证,域模型就会更新并发布事件。然而,假设信用/借记信息也直接来自外部系统,例如用户的花店发送一条消息,表示他已从用户的信用卡中收取了定期母亲节送货费用。在这种情况下,该消息看起来像是一个事件(收费已经发生),但该消息可能格式错误并且将被拒绝。那么这真的是一个命令吗?但是,需要有一种方法来发送 ACK/NACK,但这里的情况并非如此(花店只有在知道借记已发生后才会发送消息)。
编辑:只是为了澄清,我不是在谈论外部系统了解有关我的事件和/或命令的任何信息。我有一个组件从外部系统接收数据,然后必须发布事件或发送命令。问题是,我的组件应该使用事件或命令中的哪一个?
这是有界上下文的完美示例。
在代表相同或业务流程步骤的另一个系统(或有界上下文)中发生的事件不应被视为在接收系统中发生的事件。
花店系统借记事件可能具有与财务跟踪系统中发生的借记事件不同的结构。
为了解决这个问题,我将有一个端点来监听花店系统事件,然后我会让财务跟踪系统根据事件中的信息发出命令,如果需要的话,可能会将其与财务跟踪系统中的信息结合起来。发生这种情况的地方可以被视为财务跟踪系统的客户端,或者如果您愿意的话,甚至可以被视为“域服务”。
在这种特殊情况下,来自花店系统的事件带有花店系统(限界上下文)中发生的事务的信息。我不会在域服务中做出任何决策,而是向发生决策并可能发出财务跟踪系统事件的财务跟踪系统域发出命令。如果花店系统事件在财务跟踪系统中出现格式错误,您可能不想以请求/响应或 Ack/Nack 方式告知花店系统。该事件是从花店发布的,如果您实施类似的操作,就会破坏消息传递模式。您的消息传递基础设施应该允许您重试消息,甚至修复接收代码并使用新代码重试消息。
但是,如果您确实需要与 Florist 边界上下文进行通信,Florist 系统可以订阅来自财务跟踪系统的事件,以便查明事务是否已成功处理。仅当主系统决定是否发生交易时才需要这样做。
在您描述的情况下,财务跟踪系统更多的是事务日志,您唯一应该做的就是不要将花店事件视为财务跟踪系统事件。在发出导致财务跟踪系统事件的命令之间放置一些内容。
EDIT:
作为对您的编辑的回应。您的接收组件应将命令发送到财务跟踪系统域,该域反过来会发出事件(像往常一样)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)