1

私はソリューションのメッセージブローカーとしてazure service bus topicを使用しています。各サブスクリプションの私の理解によると、Azureメッセージバスは仮想キューを保持しているので、メッセージの受信終了時に妨害されるべきではありません。Azureサービスバストピックサブスクライバ受信オーダー

しかし、現実にはそれは私のシナリオでは、少し異なっている

私はいつかのための受信機を外した場合、入力は大体2秒ごと後、
  • (タイムスタンプが正しい、私はそれを確認している)されて
    • 、メッセージはAzure上でキューに登録されています。
    • その後、受信者を再度接続すると、受信コードがメッセージを非常に迅速に受信しますが、その注文は維持されません。私は、接続されたクライアントを維持する場合
    • はしかし、メッセージが順番に受信されている(2秒後に1つのメッセージ)

    受信コード

    SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, topicname, subscription_name); 
    
           // Configure the callback options. 
           OnMessageOptions options = new OnMessageOptions(); 
           options.AutoComplete = false; 
           options.AutoRenewTimeout = TimeSpan.FromMinutes(1); 
    
           // Callback to handle received messages. 
           Client.OnMessage((message) => 
           { 
            try 
            { 
             // Process message from queue. 
             string payload = message.GetBody<string>(); 
             var myData = JsonConvert.DeserializeObject<MyData>(payload); 
             if(myData != null) 
             { 
    
              //Timestamp is not in order, when I connect after few minutes 
              Debug.WriteLine("SBC ==> " + myData.Timestamp); 
    
             } 
             // Remove message from queue. 
             message.Complete(); 
            } 
            catch (Exception) 
            { 
             // Indicates a problem, unlock message in queue. 
             message.Abandon(); 
            } 
           }, options); 
    

    出力

    SBC ==> 5/23/2017 1:06:43 PM 
    SBC ==> 5/23/2017 1:06:45 PM 
    SBC ==> 5/23/2017 1:07:23 PM 
    SBC ==> 5/23/2017 1:07:19 PM 
    SBC ==> 5/23/2017 1:07:27 PM 
    SBC ==> 5/23/2017 1:07:07 PM 
    SBC ==> 5/23/2017 1:06:49 PM 
    SBC ==> 5/23/2017 1:07:47 PM 
    SBC ==> 5/23/2017 1:06:47 PM 
    SBC ==> 5/23/2017 1:08:03 PM 
    SBC ==> 5/23/2017 1:06:55 PM 
    SBC ==> 5/23/2017 1:06:51 PM 
    SBC ==> 5/23/2017 1:07:03 PM 
    SBC ==> 5/23/2017 1:07:51 PM 
    SBC ==> 5/23/2017 1:06:57 PM 
    SBC ==> 5/23/2017 1:07:05 PM 
    SBC ==> 5/23/2017 1:07:39 PM 
    SBC ==> 5/23/2017 1:07:43 PM 
    SBC ==> 5/23/2017 1:06:59 PM 
    SBC ==> 5/23/2017 1:07:09 PM 
    SBC ==> 5/23/2017 1:06:53 PM 
    SBC ==> 5/23/2017 1:07:33 PM 
    SBC ==> 5/23/2017 1:07:25 PM 
    SBC ==> 5/23/2017 1:07:57 PM 
    SBC ==> 5/23/2017 1:08:13 PM 
    

    なぜそうなのか説明できますか?私にとってはちょっと混乱しますか?

  • 答えて

    2

    azureサービスバスはFIFO(First In First Out)として機能しますが、これは実際には中断されないセッション中にのみ機能します。あなたが経験したよう:

    私は接続されたクライアントを維持した場合ただし、メッセージは、別のモードを使用することができますこの問題を回避するため

    で受信されています。 以下のリンクのReceiveAndDeleteとPeekLockモードを見てください。ここで

    Service Bus Docs

    あなたを助けるかもしれないいくつかの関連するスタックオーバーフローの記事です。

    How to accomplish FIFO with Azure service bus topics

    How to gurantee azure queue FIFO

    EDIT以下

    This link contains some details on the FIFO

    あなたはFIFOを取得するために、メッセージングセッションを使用する必要が指定することドクからの引用です。

    サービスバスキューの保証されたFIFOパターンでは、メッセージングセッションを使用する必要があります。 &ロックモードで受信したメッセージを処理中にアプリケーションがクラッシュした場合、次にキュー受信者がメッセージングセッションを受け入れると、有効期間(TTL)期間が切れた後に失敗したメッセージから開始されます。

    ドキュメントはかなりメッセージセッションの実装に欠けているように見えるが、私の理解から、それはMessageSessionクラスからであり、それは@NPhillipsはあなたがのメッセージセッション機能を使用する必要がある、と述べたと同じようにAcceptMessageSession方法

    +0

    あなたのコメントのおかげで、あなたが持っているこの '問題が出た時間が設定時間後に再試行を開始し、あなたが受信機を外したメッセージということであるMSDN上のいくつかのドキュメントを参照してくださいでした。これは彼らが送られた秩序を失う原因となる。それは本当に役立つだろう。 –

    +0

    答えに追加されます。 – NPhillips

    +0

    はそれのための固体ソースを提供することができませんとあなたが質問から引用された部分を削除しました。私は少し前にこの問題を抱えていましたが、それは私の問題の理解でしたが、もちろん私の言葉はそれをバックアップするためのドキュメントがほとんどないと考えています。私はそれが少し古くなっている疑いがあるものの あなたはこのブログの記事が役立つことがあります。 http://www.ben-morris.com/dont-assume-message-ordering-in-azure-service-bus/ – NPhillips

    2

    ですASBはFIFOの動作を実現します。これは、注意することが重要であるいくつかのことを、意味:

    1. 受信機のみ単一セッションの時間を処理する
    2. 同時処理が可能ではない、あなたがダウンして何時間ごとに単一のメッセージになりますそれは処理するのにかかる。
    3. Senderは、各メッセージにセッションIDを割り当てる必要があります。

    ベストサンプルと説明は、ASBチームがGitHub hereに投稿したものです。

    関連する問題