メッセージ処理の再試行を実装するためにServiceBusサブスクリプションのMaxDeliveryCountを使用しようとしています。それが最良のアイデアだとは確信していませんが、メッセージを失いたくはありません。Azure ServiceBusメッセージのMaxDeliveryCountによる再処理
シナリオ:
- の両方のサブスクリプションがMaxDeliveryCount = 10 を構成している
- PEEK-ロックを使用して、2人の加入者(A)を送信する一方及び他方 (B)メッセージを受信すると、1つのトピック有します
- 両方のクライアントは、... "5"、 "1"、 "2" ペイロードを有する、5つのメッセージを送信キュー
- Aからメッセージを取得する SubscriptionClient.ReceiveBatch(50、TimeSpan.FromMilliseconds(50))を使用し
最初のメッセージ(「1」)はBに処理するために失敗し、放棄された(BrokeredMessage.Abandon())
理由としてマークされている内部の理由のために、アプリケーションが今このメッセージを処理できません。
それはまだDeliveryCount < MaxDeliveryCount以来BlackLetteredていない)
- 次に、以前に失敗した「1」のメッセージから、1つのメッセージのみが要求 あり、そして(メッセージ「1」 SubscriptionClient.ReceiveBatchことが期待ですメッセージ「1」を受信する代わりに、 メッセージ「2」が受信される。メッセージ「1」のため、メッセージ「2」は、放棄されたとマークされる( )。 "が期待される
次にメッセージが「1」
など
期待 あるので、メッセージ「3」
メッセージを受信すると、「3」は、放棄されたとしてマークされています。
このシナリオでは、SBはメッセージをラウンドロビング方式で配信しているようです。
これはServiceBusの意図した動作ですか?
私は、SBが納品を保証しているかどうかについていくつかの議論が存在することを認識しています。アプリケーションでは、メッセージが送信されたのと同じ順序で処理されることが非常に重要です。
メッセージ「2」を処理する前に、DeliveryCountがMaxDeliveryCountに達するまで、メッセージ「1」の再処理がどのように実行されるかについてのアイデアはありますか?
この動作はプリフェッチに関連しているようです。 https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-performance-improvements: "クライアントが受信操作を開始し、キャッシュにメッセージが含まれている場合、メッセージが取得されますキャッシュから。 –
この記事を見たことがありますか:http://stackoverflow.com/questions/28702033/how-to-accomplish-fifo-with-azure-service-bus-topics? – Thomas
更新情報あなたは問題を解決しますか? –