【发布时间】:2019-01-21 09:50:40
【问题描述】:
这是一个与使用 Axon 4 设计命令处理相关的问题。
假设我有一个模拟Payment 概念的域。
实际付款将由外部合作伙伴完成。我想通过以下事件在我的系统中跟踪它:已发出付款请求,然后是 合作伙伴同意付款或合作伙伴拒绝付款。
命令发出的每个事件都应该注册到同一个数据库事务中。
在 Axon 4 中实际呼叫我的合作伙伴的最佳做法是什么?
这是我到目前为止所做的:
- 有一个命令名为
RequestPaymentCommand - 此命令将由
Payment聚合处理,如下所示:- 做一些检查
- 申请事件
PaymentRequestWasIssued - 然后,调用外部合作伙伴并给出结果,它将应用
PaymentAccepted或PaymentRefused
In this answer from stackoverflow,据说
您需要应用事件的所有数据通常应该在命令中可用
考虑到这句话,我明白我应该创建尽可能多的 Commands 和 Events 吗?但是在这种情况下,所有这些命令的意义何在?我是否应该得到类似的结果:
- 我的命令
RequestPaymentCommand将生成PaymentRequestWasIssued事件。 - 然后我从某个地方给我的伙伴打电话,然后发送 another 命令(如何命名它?)根据伙伴的结果生成事件?
【问题讨论】:
-
All the data that you need to apply the event should normally be available in the command or in the aggregate state- 注意 OR -
嗯,这不会改变问题:) 命令或聚合都没有数据,因为它来自外部合作伙伴
-
这似乎是 Saga 的工作 ;) Sagas 对您域中的事件做出反应,但要应用业务策略和涉及外部系统的分布式事务。在您的情况下,saga 将对 PaymentRequestWasIssued 做出反应,向实现与合作伙伴通信的特殊 commandGateway 发送命令,最后等待外部事件(来自特殊 eventGateway)在您的域中发出 PaymentAccepted/Refused 事件
-
@CarmineIngaldi 这就是我们实际所做的 :)
-
好@Sylvain!我很高兴知道我的想法很好,我没有检查这是一个“非常”老问题!
标签: cqrs event-sourcing axon