2017-05-09 30 views
0

メッセージ処理の再試行を実装するためにServiceBusサブスクリプションのMaxDeliveryCountを使用しようとしています。それが最良のアイデアだとは確信していませんが、メッセージを失いたくはありません。Azure ServiceBusメッセージのMaxDeliveryCountによる再処理

シナリオ:

  1. の両方のサブスクリプションがMaxDeliveryCount = 10
  2. を構成している
  3. PEEK-ロックを使用して、2人の加入者(A)を送信する一方及び他方 (B)メッセージを受信すると、1つのトピック有します
  4. 両方のクライアントは、... "5"、 "1"、 "2" ペイロードを有する、5つのメッセージを送信キュー
  5. Aからメッセージを取得する SubscriptionClient.ReceiveBatch(50、TimeSpan.FromMilliseconds(50))を使用し
  6. 最初のメッセージ(「1」)はBに処理するために失敗し、放棄された(BrokeredMessage.Abandon())

    理由としてマークされている内部の理由のために、アプリケーションが今このメッセージを処理できません。

    それはまだDeliveryCount < MaxDeliveryCount以来BlackLetteredていない)

  7. 次に、以前に失敗した「1」のメッセージから、1つのメッセージのみが要求 あり、そして(メッセージ「1」 SubscriptionClient.ReceiveBatchことが期待ですメッセージ「1」を受信する代わりに、 メッセージ「2」が受信される。メッセージ「1」のため、メッセージ「2」は、放棄されたとマークされる( )。 "が期待される
  8. 次にメッセージが「1」

    など

    期待 あるので、メッセージ「3」
    メッセージを受信すると、「3」は、放棄されたとしてマークされています。

このシナリオでは、SBはメッセージをラウンドロビング方式で配信しているようです。

これはServiceBusの意図した動作ですか?

私は、SBが納品を保証しているかどうかについていくつかの議論が存在することを認識しています。アプリケーションでは、メッセージが送信されたのと同じ順序で処理されることが非常に重要です。

メッセージ「2」を処理する前に、DeliveryCountがMaxDeliveryCountに達するまで、メッセージ「1」の再処理がどのように実行されるかについてのアイデアはありますか?

+0

この動作はプリフェッチに関連しているようです。 https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements: "クライアントが受信操作を開始し、キャッシュにメッセージが含まれている場合、メッセージが取得されますキャッシュから。 –

+0

この記事を見たことがありますか:http://stackoverflow.com/questions/28702033/how-to-accomplish-fifo-with-azure-service-bus-topics? – Thomas

+0

更新情報あなたは問題を解決しますか? –

答えて

0

最初に、トーマスが彼のコメントで共有したように、SupportOrdering propertyからの真のをトピックとして指定しようとする可能性があります。

TopicDescription td = new TopicDescription("TopicTest"); 
td.SupportOrdering = true; 

およびサブスクリプションクライアントがメッセージを受信し、PEEK-ロックメッセージのロックを放棄するAbandonメソッドを呼び出した場合、我々はこのように、再びそれを得るために再びReceiveメソッドを呼び出すことができます。

enter image description here

出力:

一方

enter image description here

、可能な場合は、あなたの代わりに単一メッセージに特定の順序で完全な作業ステップを組み合わせること試みることができます複数のメッセージで分割ステップを実行した後で、サービスバスインフラストラクチャで返信するのではなく、コードロジックで特定の順序で処理を制御することができますe。

+0

フレッド、もう一度supportOrderingオプションを確認します。私はこれを本当に設定したことを覚えていますが、問題は解決されませんでした。 –

関連する問題