2016-01-04 1 views
2

Сценарий: У меня есть сага с 10 шагами. Это обновление различных систем, и вся сага может занять несколько минут.NServiceBus - очередь с сагами с тем же ключом

Сага запускается с данными другой системы, где пользователи вводят информацию о клиенте.

Я не могу видеть, когда пользователь делает ввод данных в своей системе, но я читаю данные с изменениями из системы каждые x минут.

Моя проблема заключается в том, что всякий раз, когда я начинаю сагу с данными о клиенте, мне нужно убедиться, что предыдущая сага на том же клиенте закончилась. Если пользователь тратит 10 минут на ввод данных, система может запустить 5 потоков для одного и того же клиента, а потоки могут обогнать предыдущие потоки и испортить данные.

У кого-нибудь есть идея, как я могу это разрешить?

Заранее спасибо.

Ole

+1

Не могли бы вы сделать свой уникальный атрибут идентификатором клиента? Если это так, вы можете позволить сообщению, которое начинает сагу, также отображаться и обрабатываться сагой. Таким образом, если запущена сага с идентификатором клиента 1 и поступит новое сообщение (обновление, полученное для клиента 1), результат будет обрабатываться одной сагой. Если это не сработает, не могли бы вы предоставить короткие фрагменты кода о ваших отображениях саги + сообщение инициализации. –

ответ

0

Вы не можете решить эту проблему, не меняя сагу и, вероятно, сообщения, которые направляются по системе клиента.

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

Назовёх это сообщение:

public class ClientTypedSomethingAboutCustomer 
{ 
    int CustomerId {get;set;} 
    ... 
} 

Ваша сага будет настроить что-то вроде этого:

public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer> 
{ 
    public override void ConfigureHowToFindSaga() 
    { 
     ConfigureMapping<ClientTypedSomethingAboutCustomer> 
      (message => message.CustomerId).ToSaga(saga => saga.CustomerId); 
     ... 
    } 
    ... 
} 

Это приводит к тому, саге быть инициализируются и значение идентификатора клиента, установленное в реализации IContainSagaData , для каждого полученного сообщения клиента.

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

Что-то вроде:

public class ClientTypedSomethingElseAboutCustomer 
{ 
    int CustomerId {get;set;} 
    ... 
} 

Тогда ваша сага будет выглядеть следующим образом:

public class CustomerSaga : Saga<CustomerSagaData>, IAmStartedByMessages<ClientTypedSomethingAboutCustomer> 
    ,IHandleMessages<ClientTypedSomethingElseAboutCustomer> 
{ 
    public override void ConfigureHowToFindSaga() 
    { 
     ConfigureMapping<ClientTypedSomethingAboutCustomer> 
      (message => message.CustomerId).ToSaga(saga => saga.CustomerId); 

     ConfigureMapping<ClientTypedSomethingElseAboutCustomer> 
      (message => message.CustomerId).ToSaga(saga => saga.CustomerId); 
    } 
    ... 
} 

Это гарантирует, что все сообщения о клиенте будет перенаправлен к одному экземпляру саг.

Возможно, возможно получить приблизительное поведение в очереди, запустив NServiceBus в однопоточном режиме. Это может ограничить создание параллельных саг для клиента, но я не хотел бы полагаться на это.

+0

. Вы также можете реализовать сложную логику поиска саги. –

+0

Как описано в документах: «По существу семантика IAmStartedByMessages: Создать новую если существующий не может быть найден ». http://docs.particular.net/nservicebus/sagas/#starting-a-saga –

0

Оба: @janpieter_z и @ tom-redfern верны: убедитесь, что вы можете сопоставить сагу с идентификатором клиента.

Вы также можете ввести complex saga finding logic, чтобы найти правильную саге, соответствующую сообщению.

Кроме того, несколько сообщений могут быть установлены как «IAmStartedByMessages», если они не поступают в надлежащем порядке.

И наконец, кто отправляет сообщения в вашу сагу? Должна ли сага нести ответственность за отправку запросов на сбор данных? Возможно, каждые 10 секунд через тайм-ауты или что-то еще, пока ничего не получено в течение нескольких минут, или обработчик отвечает другим сообщением?

 Смежные вопросы

  • Нет связанных вопросов^_^