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())
在事件处理程序中调度命令时,您应该从正在处理的事件中复制这些值:
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。