Сага NServiceBus Уникальный атрибут

У меня есть класс данных саги с одним свойством, отмеченным уникальным атрибутом. Однако это не помешало NServiceBus создать несколько саг с одинаковыми значениями в этом поле.

Вот мой класс данных:

public class ModuleAliveSagaData : ContainSagaData
{
    [Unique]
    public string ModuleId { get; set; }
    public string Endpoint { get; set; }
    public string Module { get; set; }
    public DateTime LastCheck { get; set; }
    public bool Warning { get; set; }
    public bool Error { get; set; }
}

Вот отображение:

public override void ConfigureHowToFindSaga()
{
    ConfigureMapping<ModuleAliveMessage>(m => m.Id).ToSaga(s => s.ModuleId);
}

Вот как данные получают свои значения:

    public void Handle(ModuleStartedMessage message)
    {
        Log.InfoFormat("Module {0} started on {1} at {2}", message.ModuleName, message.Endpoint, message.Timestamp);
        Data.ModuleId = message.Id;
        Data.Endpoint = message.Endpoint;
        Data.Module = message.ModuleName;
        Data.LastCheck = DateTime.Now;
        Data.Warning = false;
        Bus.SendLocal(new SendNotification
        {
            Subject = string.Format("Module {0} is online at {1}", Data.Module, Data.Endpoint)
        });
        RequestTimeout<ModuleCheckTimeout>(TimeSpan.FromMinutes(5));
        Bus.Publish(new ModuleActivated
        {
            Endpoint = message.Endpoint,
            Module = message.ModuleName
        });
    }

И вот что я вижу в таблице сохраняемости саги (хранилище таблиц Azure):

Это должно работать так или может быть я что-то упускаю?

введите здесь описание изображения


person Alexey Zimarev    schedule 13.02.2015    source источник
comment
Можете ли вы поделиться своим кодом где-нибудь (или кодом воспроизведения)?   -  person Sean Farmar    schedule 14.02.2015
comment
Я создал репозиторий здесь github.com/alexeyzimarev/SagaUniqueTest. Он отправляет сообщение, которое запускает новую сагу каждые 30 секунд. Значение уникального атрибута сообщения одинаково для всех этих сообщений, однако каждый раз создается новая сага.   -  person Alexey Zimarev    schedule 14.02.2015
comment
Алексей, лазурное хранилище не может проверять уникальность, кроме пары partitionkey/rowkey, поэтому этот атрибут игнорируется. Если вам нужна уникальность, вам придется рассмотреть другую технологию хранения. PS: это известное ограничение базового хранилища: github.com/Particular/NServiceBus. Azure/issues/21   -  person Yves Goeleven    schedule 16.02.2015
comment
Спасибо, Ив, я начал подозревать это, когда подумал о базовой технологии. Я хотел попробовать хранилище подписки RavenDb, но мы используем версию 3 для самого приложения, которое конфликтует с клиентом версии 2, встроенным в используемую нами шину NServiceBus 4.7. Мне удалось создать обходной путь для этой проблемы, который на данный момент в порядке. Если вы создадите ответ на этот вопрос, я отмечу его, чтобы, если кто-то получит эту проблему, он знал, что такое ответ :)   -  person Alexey Zimarev    schedule 16.02.2015


Ответы (1)


Ив написал это в комментариях, в основном это правильный ответ:

Хранилище Azure не может проверять уникальность, кроме пары partitionkey/rowkey, поэтому этот атрибут игнорируется. Если вам нужна уникальность, вам придется рассмотреть другую технологию хранения. PS: это известное ограничение базового хранилища: http://github.com/Particular/NServiceBus.Azure/issues/21

person Alexey Zimarev    schedule 14.03.2015