Идентификатор корреляции и причинно-следственной связи в команде - PullRequest
0 голосов
/ 12 декабря 2018

Грег Янг, автор Event Store , недавно определил идентификатор корреляции для ссылки на основную причину и идентификатор причины для ссылки на прямую причину сообщения.

Следовательно, вы должны быть в состоянии найти одно сообщение, на которое другое сообщение является прямым ответом, посредством идентификатора причины другого сообщения.И вы должны быть в состоянии найти все сообщения в одном и том же диалоге, используя те же идентификаторы причин.

Если этот шаблон применяется, второе сообщение в диалоге должно иметь как идентификатор корреляции, так и набор идентификаторов причин.к первому сообщению.

В Comaged я бы ожидал, что первое событие будет иметь как идентификатор корреляции, так и идентификатор причинно-следственной связи, чтобы указывать на команду, которая вызвала событие (также визуально описано здесь ).

В замешательстве в собственном хранилище событий Команды, кажется, что первое событие после команды имеет разные идентификаторы корреляции и причинности.Таким образом, кажется, что Командующий не применяет определение Грега Янга.

Мой вопрос будет таким: каково именно определение этих идентификаторов в Командовании?Было ли это сознательным решением не следовать определению Грега Янга, и если да, то почему?

1 Ответ

0 голосов
/ 12 декабря 2018

В команде реализованы идентификаторы корреляции и причинности , как описано в руководствах, скопированных ниже.

По умолчанию команды не будут сохраняться , поэтому вы не можете следоватьцепочка причин и следствий из команды> событие> команда, если вы не сохраняете входящие команды.Вы можете использовать Промежуточное программное обеспечение для командного аудита для хранения отправленных команд в любой базе данных, поддерживаемой 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

Команды, отправленные диспетчером процессов, автоматически получат соответствующие идентификаторы причинно-следственных связей и корреляции из события исходного домена..

...