在处理与Axon 4的外部合作伙伴时设计命令和事件

Syl*_*ain 4 cqrs event-sourcing axon

这是与使用Axon 4设计命令处理有关的问题。

假设我有一个模型可以模拟的概念Payment

实际付款将由外部合作伙伴完成。我想通过以下事件在我的系统中进行跟踪:发出付款请求,然后由 合作伙伴同意付款合作伙伴拒绝付款

该命令发出的每个事件都应注册在同一数据库事务中。

在Axon 4中实际给我的伴侣打电话的最佳做法是什么?


到目前为止,这是我所做的:

  • 一个名为RequestPaymentCommand
  • 此命令将由Payment像这样的聚合来处理:
    • 做一些检查
    • 申请活动 PaymentRequestWasIssued
    • 然后,调用外部的合作伙伴,给它适用无论是结果PaymentAccepted还是PaymentRefused

在这个stackoverflow的答案中,据说

通常,在命令中应该可以应用事件所需的所有数据。

考虑到这一点,我知道我应该创建与事件一样多的命令?但是在这种情况下,所有这些命令的意义是什么?我是否应该得到类似以下的结果:

  • 我的命令RequestPaymentCommand将生成PaymentRequestWasIssued事件。
  • 然后从某个地方打电话给我的伙伴,然后发送另一个命令(如何命名?),该命令将根据伙伴的结果生成事件?

Con*_*enu 5

实际付款将由外部合作伙伴完成

这意味着您的应用程序不是真理的源头,并且不应尝试表现得像事实。这意味着它应该仅观察远程系统中正在发生的事情,并且可能会对远程事件做出反应。“观察”可能意味着仅出于缓存原因或出于显示原因而无需修改即可复制/复制本地数据库中的远程事件。您的系统不应直接对这些事件进行其他解释,除非其来源给出了解释。

在本地复制远程事件后,您的系统可以对它们做出反应。这可能意味着Saga在收到Saga之后Partner Agreed the PaymentUnlockFeature命令发送到本地Aggregate(请参见DDD)。

考虑到这一点,我知道我应该创建与事件一样多的命令?但是在这种情况下,所有这些命令的意义是什么?

这表明这些不是您的事件:您不应从代码中发出这些事件;在最坏的情况下,您将它们存储起来并对其做出反应(在Saga / Process Manager中)。这意味着您应该发现本地业务流程并对其进行建模:它们通过发送命令对事件做出反应。