2011-09-15 2 views
5

Я понимаю, что служебный документ MS Azure Queue http://msdn.microsoft.com/en-us/library/windowsazure/dd179363.aspx говорит, что поведение первого выхода (FIFO) не гарантируется.Как гарантировать azure queue FIFO

Однако наше приложение таково, что ВСЕ сообщения должны быть прочитаны и обработаны в порядке FIFO. Может ли кто-нибудь предложить, как добиться гарантированного FIFO, используя службу очереди Azure?

спасибо.

ответ

3

В последней версии Service Bus предлагает надежный обмен сообщениями очередями: Queues, topics and subscriptions

+0

Thnks Richrdbower –

+0

К сожалению, это, похоже, отвечает на другой вопрос, на что указывает OP. Azure Service Bus - это другой зверь для службы очередей Azure –

1

Вам просто нужно следить за бельем ow для обеспечения порядка сообщений:

1) Создайте очередь с сеансом enabled = false. 2) При сохранении сообщения в очереди, предоставить идентификатор сеанса, как показано ниже: -

var message = new BrokeredMessage(item); 
message.SessionId = "LB"; 
Console.WriteLine("Response from Central Scoring System : " + item); 
client.Send(message); 

3) При создании приемника для возрождающихся сообщений: -

queueClient.OnMessage(s => 
{ 
    var body = s.GetBody<string>(); 
    var messageId = s.MessageId; 
    Console.WriteLine("Message Body:" + body); 
    Console.WriteLine("Message Id:" + messageId); 
}); 

4) В то время как имеющие один и тот же идентификатор сеанса , он автоматически обеспечит порядок и предоставит упорядоченное сообщение.

Спасибо!

0

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

Используйте это в своей программе program.cs в верхней части функции.

static void Main() 
      { 
       var config = new JobHostConfiguration(); 

       if (config.IsDevelopment) 
       { 
        config.UseDevelopmentSettings(); 
       } 
       config.Queues.BatchSize = 1; //Number of messages to dequeue at the same time. 
       config.Queues.MaxPollingInterval = TimeSpan.FromMilliseconds(100); //Pooling request to the queue. 


       JobHost host = new JobHost(config); 

....your initial information... 

      // The following code ensures that the WebJob will be running continuously 
      host.RunAndBlock(); 

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

Это прекрасно работает с веб-блогером регистрации, чтобы записывать в файлы информацию о трассировке.

0

docs говорят для очередей Azure Storage, что:

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

Возможно, это достаточно хорошо для вас? Просто используйте служебную шину.

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