Commanded 中的相关性和因果关系 ID

aef*_*aef 4 events elixir cqrs event-sourcing commanded

Event Store的作者 Greg Young不久前定义了关联ID 来引用根本原因,以及因果 ID 来引用消息的直接原因。

因此,您应该能够通过另一条消息的因果 ID 找到另一条消息对其进行直接响应的一条消息。您应该能够通过具有相同因果 ID 的消息找到同一对话中的所有消息。

如果应用此模式,会话中的第二条消息应将相关 ID 和因果 ID 设置为第一条消息。

在 Commanded 中,我希望第一个事件具有相关 ID 和因果 ID 来指向导致事件发生的命令(也可以在此处进行直观描述)。

令人困惑的是,在 Commanded 自己的事件存储中,命令后的第一个事件似乎具有不同的相关性和因果 ID。所以看来 Commanded 并不适用 Greg Young 的定义。

我的问题是,Commanded 中这些 ID 的具体定义是什么?不遵循格雷格·杨的定义是否是一个有意识的决定?如果是,为什么?

Ben*_*ith 5

Commanded 已实现相关性和因果关系 ID,如指南中所述,复制如下。

默认情况下,命令不会被持久化,因此您无法从命令 > 事件 > 命令跟踪因果链,除非您也持久化传入的命令。您可以使用Commanded 审核中间件将调度的命令存储到任何 Ecto 支持的数据库。这样做将允许您将命令及其结果事件联系在一起。关联 ID 还可以用于关联所有相关消息,假设您在分派命令时复制它们。下面给出了这样做的示例。

在 Greg 的事件存储中,我认为因果 id 是从一个事件复制到另一个事件,忽略中间命令,因为他的事件存储仅存储事件。


相关性和因果 ID

为了帮助监视和调试已部署的应用程序,跟踪命令和事件的因果关系和相关 ID 非常有用。

  • causation_id- 导致事件的命令的 UUID,或导致命令调度的事件。
  • correlation_id- 用于关联相关命令/事件的 UUID。

您可以在分派命令时设置因果关系和相关 ID:

:ok = ExampleRouter.dispatch(command, causation_id: UUID.uuid4(), correlation_id: UUID.uuid4())
Run Code Online (Sandbox Code Playgroud)

在事件处理程序中分派命令时,您应该从正在处理的事件中复制这些值:

defmodule ExampleHandler do
  use Commanded.Event.Handler, name: "ExampleHandler"

  def handle(%AnEvent{..}, metadata) do
    %{event_id: causation_id, correlation_id: correlation_id} = metadata

    ExampleRouter.dispatch(%ExampleCommand{..},
      causation_id: causation_id,
      correlation_id: correlation_id
    )
  end
end
Run Code Online (Sandbox Code Playgroud)

流程管理器分派的命令将自动分配来自源域事件的适当因果关系和相关 ID。