【问题标题】:Design Commands And Events while Handling External partner with Axon 4使用 Axon 4 处理外部合作伙伴时设计命令和事件
【发布时间】: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


【解决方案1】:

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

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

远程事件被复制到本地后,您的系统可以对它们做出反应。这可能意味着 Saga 在收到 Partner Agreed the Payment 后会向本地聚合发送 UnlockFeature 命令(请参阅 DDD)。

考虑到这句话,我明白我应该创建尽可能多的 Commands 和 Events 吗?但是在这种情况下,所有这些命令的意义何在?

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

【讨论】:

  • 好的,我知道我的聚合 Paymenthere 实际上是一个 Saga ?有道理……
  • @Sylvain 是的,但不是完全那样。您需要识别业务流程并为其命名以描述其含义。 Payment 含糊其辞:支付什么,为了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-18
  • 2011-01-08
  • 2020-12-07
  • 1970-01-01
  • 2021-09-04
  • 2021-07-20
相关资源
最近更新 更多