Как создать NServiceBus Saga, начатую с получения нескольких сообщений

Я пытаюсь найти помощь по разработке Saga в NServiceBus 5.x, который запускается 2 или более сообщениями. Это означает, что сага не будет начинаться с одного сообщения, но все сообщения должны присутствовать до начала саги.

Я не совсем понимаю, как это будет работать, и нигде нет примеров или примеров.

Я прочитал пару книг, в которых четко говорится, что сага начинается с нескольких сообщений.

Чего я не понимаю, так это как найти сагу, когда вам нужно, например, 3 сообщения, чтобы начать сагу. Все 3 сообщения должны прибыть в любом порядке, прежде чем сага сможет "запуститься". Как это влияет на мой выбор [Unique] атрибут?

Пример: мне нужна сага, которая "уникальна" и определяется тремя идентификаторами: "StoreID", "ComputerID", "UserID". Эти три идентификатора будут приходить в трех разных командах, Message1, Message2, Message3,

public class MySaga : Saga<MySagaData>, 
IAmStartedByMessages<Message1>, 
IAmStartedByMessages<Message2>, 
IAmStartedByMessages<Message3>
{ ...
}

Должен ли MySagaData иметь атрибут [Уникальный] для трех свойств?

public class MySagaData
{
    [Unique]
    public int StoreId {get;set;}
    [Unique]
    public int ComputerId {get;set;}
    [Unique]
    public int UserId {get;set;}
}

Или я должен создать свойство readonly, объединяющее эти три?

когда Message1 а также Message3 прибыть, сага не может быть начата. Message2 пропал, отсутствует.

Потом еще Message1 прибывает.

затем Message2 прибывает. (завершая первую сагу, чтобы ее можно было начать)

Как насчет второго Message1?

Как бы это было обработано?

3 ответа

Каждое сообщение, обработанное вашей полученной реализацией Saga, будет принадлежать только одному экземпляру этой Saga. В каждом из этих 3-х сообщений вам все равно потребуется какой-то способ сопоставить их с одним и тем же экземпляром Saga.

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

После этого ваша Saga может просто подождать, пока не получит все 3 сообщения, чтобы начать делать то, что вы хотите сделать, проверив, что все три из этих идентификаторов установлены, прежде чем делать то, что нужно Saga.

Саги не поддерживают шаблон, который вы описываете. Директивы IAmStartedByMessages применяются с ЛЮБОЙ, а не ВСЕ семантической.

В общем, у вас есть два варианта;

  1. запустите свой экземпляр саги с одним из обязательных сообщений, а затем просто обработайте прибытие других, как и когда они будут отправлены, или
  2. реализовать шаблон Aggregator до того, как будет вызвана ваша сага, что, очевидно, устранит необходимость ожидания нескольких сообщений.

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

Другие вопросы по тегам