Greg Young,Event Store 的作者, defined a while ago引用根本原因的相关 ID 和引用消息直接原因的因果 ID。
因此,您应该能够通过另一条消息的因果关系 ID 找到另一条消息直接响应的一条消息。您应该能够通过具有相同因果关系 ID 的同一对话中的所有消息找到它们。
如果应用此模式,对话中的第二条消息应将相关 ID 和因果 ID 设置为第一条消息。
在 Commanded 中,我希望第一个事件具有关联 ID 和因果关系 ID,以指向导致事件发生的命令(也直观地描述了 here)。
令人困惑的是,在 Commanded 自己的事件存储中,命令后的第一个事件似乎具有不同的相关性和因果关系 ID。因此,Commanded 似乎不适用 Greg Young 的定义。
我的问题是,Commanded 中这些 ID 的具体定义是什么?不遵循 Greg Young 的定义是否是有意识的决定?如果是,为什么?
最佳答案
命令已实现correlation and causation ids如指南中所述,复制如下。
默认情况下,命令不会被持久化,因此您不能从 command > event > command 追踪因果链和影响,除非您也持久化传入的命令。您可以使用 Commanded audit middleware将分派(dispatch)的命令存储到任何 Ecto 支持的数据库。这样做将使您能够将命令及其结果事件联系在一起。关联 ID 也可用于关联所有相关消息,假设您在发送命令时复制它们。下面给出了这样做的示例。
在 Greg 的事件存储中,我认为因果 ID 是从一个事件复制到另一个事件,忽略中间命令,因为他的事件存储只存储事件。
相关性和因果关系 id
为了协助监控和调试已部署的应用程序,跟踪命令和事件的因果关系和相关性 ID 非常有用。
causation_id
- 导致事件的命令的 UUID,或导致命令分派(dispatch)的事件。correlation_id
- 用于关联相关命令/事件的 UUID。
您可以在发送命令时设置因果关系和相关性 ID:
:ok = ExampleRouter.dispatch(command, causation_id: UUID.uuid4(), correlation_id: UUID.uuid4())
在事件处理程序中发送命令时,您应该从正在处理的事件中复制这些值:
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
流程管理器派发的命令将自动从源域事件中分配适当的因果关系和相关性 ID。
关于events - Commanded 中的相关性和因果关系 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53740867/