【问题标题】:Saga , Commands , events & ReadModelSaga , 命令, 事件 & ReadModel
【发布时间】:2023-10-22 14:41:02
【问题描述】:

我目前正在编写我的第一个 saga,我对读取模型有点困惑。让我们用一个例子来解释它:

我有三个有界上下文:programmingcontractorcontrol。它们中的每一个都有其特定的读取模型。

工作流程:

  • 编程发送一个事件“JobScheduled
  • Saga 收到此事件并告诉承包商安排工作”。
  • 完成后,承包商发送一个事件“JobDone”。
  • Saga 收到此事件并告诉 Control开始控制期”。

这里一切都很好。我们处于写入端,因此我们正在传递重要信息以使流程继续进行。

我的问题带有不必要的信息。假设事件“JobScheduled” 有一个注释字段:“测试注释”,在此工作完成之前,该字段更改为“测试注释重要”。此更改对所描述的工作流并不重要,但重要的是 contractor 在查看 contractor 有界的读取模型时可能会看到字段中的更改上下文。

我是要将事件 NoteChanged 提供给 saga 并对其进行处理,还是应该在我的 contractor 有界上下文中创建一个直接监听此事件的投影?

将它提供给 saga 在我看来是不必要的工作,因为我只是在此处更新 readmodel,没有涉及更改的域。

另一方面,在两个限界上下文之间进行直接耦合会删除 sagas 的一项资产,即修改限界上下文在工作流中彼此之间的交互的可能性。

感谢您的阅读,

【问题讨论】:

    标签: cqrs event-sourcing saga


    【解决方案1】:

    如果更改注释很重要,则应显式建模。这可以通过引入一个事件来完成,就像你已经做过的那样。

    如果所述事件与流程有任何相关性,则可以由 Saga 处理。如果它只需要在不同的读取模型中表示,那么只需在它们各自的投影中处理它就可以了。

    一个上下文可以很好地监听和处理另一个上下文的事件,甚至跨越应用程序边界。至少这就是跨上下文集成在以事件为中心的架构中的工作方式。

    【讨论】:

      【解决方案2】:

      我个人会发送一个命令“更改注释”,因为我认为它就像一个必须保存在聚合事件流中的信息。如果你的传奇没有“感觉”告诉任何人这个命令,或者只是将信息提供给一个悄悄更新你的读取模型的处理程序,我想这很好。

      【讨论】:

      • 你说得对,错字我的意思是 ChangeNote。谢谢指出