【问题标题】:How to guarantee azure queue FIFO如何保证 azure queue FIFO
【发布时间】:2011-11-17 19:19:51
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: azure azure-storage


    【解决方案1】:

    docs 表示 Azure 存储队列:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不幸的是,这似乎回答了与 OP 提出的问题不同的问题。 Azure 服务总线与 Azure 队列服务不同
      【解决方案3】:

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

      MSDN(链接已停用) http://msdn.microsoft.com/en-us/library/windowsazure/hh767287.aspx

      docs.microsoft.com https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-azure-and-service-bus-queues-compared-contrasted

      【讨论】:

        【解决方案4】:

        您只需要按照以下步骤来确保消息排序。:

        1) 创建一个启用会话的队列=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相同的情况下,会自动保证顺序并给出有序消息。

        谢谢!!

        【讨论】:

        • 我猜这个问题是关于存储队列的
        【解决方案5】:

        我不知道您希望多快处理消息,但如果您需要真正的 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 毫秒。

        这与记录器网络作业完美配合,可将 traze 信息写入文件。

        【讨论】:

        • 这不是上面描述的情况。即使您只有一个串行生产者,如果单个消费者崩溃并开始读取,而失败的消息不可见,消息仍然会乱序到达。
        • @CodeMonkey,您确定如果消息不可见,它不被视为会话的一部分吗?您能否提供任何链接来证明您提到的行为?
        • @MichaelFreidgeim 我认为我们在这里混淆了存储帐户队列和 Azure 服务总线队列。存储帐户队列没有顺序保证。会话是 Azure 服务总线的一项功能。
        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

          正如这里提到的https://www.jayway.com/2013/12/20/message-ordering-on-windows-azure-service-bus-queues/ 在服务总线中也不能保证订购,除非使用有风险的接收和删除模式

          【讨论】:

            猜你喜欢
            • 2018-12-02
            • 1970-01-01
            • 1970-01-01
            • 2021-12-25
            • 1970-01-01
            • 2010-11-09
            • 1970-01-01
            • 2021-11-13
            • 1970-01-01
            相关资源
            最近更新 更多