Как выполнить FIFO с помощью служебной шины Azure темы

Искали шину сообщений с функцией публикации / подписки. Выяснилось, что AWS SQS не поддерживает FIFO, поэтому пришлось отказаться от него. Работая со служебной шиной Azure, обнаружил, что очереди действительно поддерживают FIFO, но похоже, что темы не поддерживают FIFO. И темы - это то, что нам нужно, с их моделью pub-to-many-sub :(

Это просто параметр, который мне не хватает? Я попытался отправить 100 сообщений из своего клиента C #, но подписчики получили сообщения в неправильном порядке. Любые советы будут оценены. Спасибо!


person mattr    schedule 24.02.2015    source источник
comment
Не знаком с Azure. Но с помощью WCF вы можете украсить свой контракт: [ServiceBehavior (InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single,)] Может быть, есть похожая вещь для Azure?   -  person David P    schedule 24.02.2015
comment
Я опубликовал сообщения в тему с данными messageId от 0 до 99. На принимающей стороне подписчики показали, что они получили 93 до 91 и т. Д.   -  person mattr    schedule 24.02.2015
comment
stackoverflow.com/questions/ 7430036 /   -  person Mohit Verma    schedule 31.03.2017


Ответы (2)


Вы можете добиться этого, установив для свойства SupportOrdering значение true.

    // Configure Topic Settings
    TopicDescription td = new TopicDescription("TestTopic");
    td.SupportOrdering = true;

    // Create a new Topic with custom settings
    string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

    var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
    namespaceManager.CreateTopic(td);
person Low Flying Pelican    schedule 24.02.2015
comment
Я нашел эту ссылку, которая, кажется, говорит, что SupportOrdering работает только для одного потребителя. Если это так, мы вернулись к очереди служебной шины Azure, не так ли? social.msdn.microsoft.com/Forums/windowsserver/en-US/ - person mattr; 25.02.2015
comment
да ... если это так, вы, вероятно, захотите использовать другой подход. Но вы это проверили? - person Low Flying Pelican; 25.02.2015
comment
Я сделал. И FIFO, похоже, работает с несколькими потребителями одной и той же темы. Спасибо еще раз! Немного странно, что я не смог найти никакой реальной документации от Microsoft по флагу SupportOrdering. - person mattr; 25.02.2015

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

Гарантии сеансов тут мало. Например, если вы используете режим PeekLock, то сообщение, которое истекло, вернется в очередь и будет обработано вне очереди. Вы можете использовать режим ReceiveAndDelete, чтобы противостоять этому поведению, но это означает, что вы теряете транзакционный характер обработки сообщений.

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

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

Более подробно обсуждается здесь: Не предполагайте порядок сообщений в служебной шине Azure

person Ben Morris    schedule 13.03.2015