如何保证azure队列FIFO

时间:2011-09-15 11:27:48

标签: azure azure-storage

我了解MS Azure队列服务文档http://msdn.microsoft.com/en-us/library/windowsazure/dd179363.aspx表示无法保证首次输出(FIFO)行为。

但是,我们的应用程序是必须以FIFO顺序读取和处理所有消息。任何人都可以建议如何使用Azure队列服务实现有保证的FIFO?

谢谢。

7 个答案:

答案 0 :(得分:4)

最新的Service Bus版本提供可靠的消息队列排队:Queues, topics and subscriptions

答案 1 :(得分:1)

添加到@RichBower答案...查看此... Azure存储队列与Azure服务总线队列

http://msdn.microsoft.com/en-us/library/windowsazure/hh767287.aspx

答案 2 :(得分:1)

您只需按照以下步骤确保消息订购。:

1)创建一个session enabled = false的队列。 2)在队列中保存消息时,提供如下的会话ID: -

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)虽然具有相同的会话ID,但它会自动确保订单并提供有序的消息。

谢谢!

答案 3 :(得分:1)

docs对Azure存储队列说:

  

存储队列中的消息通常是先进先出,但有时它们可​​能会出现故障;例如,当一条消息时   可见性超时持续时间到期(例如,由于a   客户端应用程序在处理期间崩溃)。当能见度   超时到期后,消息在队列中再次可见   另一名工人将其出列。那时,新的可见消息   可能会在消息之后放入队列(要再次出列)   最初在它之后排队。

也许这对你来说足够好了?否则使用服务总线。

答案 4 :(得分:0)

如前所述https://www.jayway.com/2013/12/20/message-ordering-on-windows-azure-service-bus-queues/除了使用有风险的接收和删除模式外,服务总线也不保证订购

答案 5 :(得分:0)

我不知道您希望处理消息的速度有多快,但如果您需要拥有真正的FIFO,请不要让Azure的队列在一个消息中获取多条消息时间。

在你的&#34; program.cs&#34;在功能的顶部。

    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毫秒。

这与记录器webjob完美配合,可以将文件信息写入文件。

答案 6 :(得分:0)

不幸的是,许多答案误导了服务总线队列,但我认为问题与提到的标签中的存储队列有关。在 Azure Storage Queues 中,不保证 FIFO ,而在 Service Bus 中,FIFO 消息排序是有保证的,而且只有使用称为会话的概念强>.

一个简单的场景可能是,如果任何消费者从队列中收到一条消息,当您是第二个接收者时,您将看不到该消息。所以你假设你收到的第二条消息实际上是第一条消息(FIFO失败的地方:P)

如果这不是您的要求,请考虑使用服务总线。