В команде реализованы идентификаторы корреляции и причинности , как описано в руководствах, скопированных ниже.
По умолчанию команды не будут сохраняться , поэтому вы не можете следоватьцепочка причин и следствий из команды> событие> команда, если вы не сохраняете входящие команды.Вы можете использовать Промежуточное программное обеспечение для командного аудита для хранения отправленных команд в любой базе данных, поддерживаемой Ecto.Это позволит вам связать команды и их результирующие события вместе.Идентификатор корреляции также можно использовать для связывания всех связанных сообщений, при условии, что вы копируете их при отправке команд.Ниже приведен пример этого.
В хранилище событий Грега я думаю, что идентификатор причинности копируется из события в событие, игнорируя промежуточную команду, поскольку его хранилище событий хранит только события.
Идентификаторы корреляции и причинности
Чтобы помочь в мониторинге и отладке развернутого приложения, полезно отслеживать идентификаторы причинно-следственных связей и корреляции для ваших команд и событий.
causation_id
- UUID команды, вызывающей событие, или событие, вызывающее отправку команды. correlation_id
- UUID, используемый для корреляции связанных команд / событий.
Youможет установить идентификаторы причинности и корреляции при отправке команды:
: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
Команды, отправленные диспетчером процессов, автоматически получат соответствующие идентификаторы причинно-следственных связей и корреляции из события исходного домена..