2016-10-25 5 views
4

シーケンス番号を失った場合、Azure Service Busで遅延メッセージをリカバリまたは削除する方法はありますか?シーケンス番号のないAzureサービスバスの遅延メッセージのクリーンアップ

シナリオ:メッセージを延期するのにBrokeredMessage.Defer()を使用します。シーケンス番号を記録し、後でそれを使用してメッセージを取得する予定です。しかし何かがうまくいかない場合(バグのあるコードが導入されたとしましょう)、シーケンス番号が正しく記録されていない場合、メッセージが期限切れになるまでサービスバスにメッセージが残るようです。

これは、そのメッセージがキューまたはサブスクリプションの領域を占有し、そのキュー/サブスクリプションを完全に削除するのに足りない方法でその領域を回復する方法が見つからなかったためです。

"紛失した"遅延メッセージを受信または削除する方法はありますか?

答えて

1

キューまたはサブスクリプションからのピッキングメッセージは、遅延メッセージも返します。 遅延メッセージはState = "Deferred"になります。

このようにすると、遅延メッセージのシーケンス番号を取得したあとで、これらのメッセージを処理または削除できます。

あなたはServiceBusエクスプローラでこれを試してみることができます。

Deferred message in ServiceBus Explorer

+0

はい!私は数ヶ月前にこれを実際に考え出しました。これをレスポンスとして追加していただきありがとうございます。これはまさに私が質問したときに私が探していたものです。 遅延はキューのメッセージの順序を変更しないため、遅延メッセージはキューの先頭に表示される傾向があります。 '.Peek()'や '' .PeekBatch() ''と呼ばれます。 – dshpak

2

失われたシーケンス番号のために孤立した据え置きメッセージを防止することに関しては、保持プロセスを保持するストレージプロセスに、おそらくは別のキューを使用して回復力を構築する必要があります。つまり、メッセージを延期する場合は、別のキューまたはトピックにメッセージを作成して、遅延シーケンス番号またはメッセージ全体(クローン)を保存します。

通常、すべての遅延メッセージを自分自身の「遅延トピック」に移動し、別々に処理します。言い換えれば、私自身のカスタム延期論理です。問題を完全に回避します。あなたのシナリオ(BrokeredMessage.TimeToLive)で自動タイムアウトロジックが動作しない場合、これはあなたのためのより良いルートかもしれません。

この記事はQueue.Receiveの特別な過負荷使用して、部分的にあなたのシナリオを説明するのは良い仕事をしていません:あなたは(:-)弾力の方法で)シーケンス番号を記憶しているので

http://markheath.net/post/defer-processing-azure-service-bus-message

をもう1つの方法は、メッセージ全体(JSON、プロパティバッグなど)を保存し、もう一度(別のキューから)処理したいときに再送信することです。

+0

感謝を。私が検討しているアプローチは、実際にはシーケンス番号を保持するためにキューを使用することなので、安全でなければなりません。私は非常に単純な(そして残念なことにそのような)「私のコードにはバグがあります」というような失敗シナリオを考えています。たとえば、プロダクションコードでアクティブに使用されているキューを削除せずに、500 MBのメッセージが遅延してシーケンス番号が永久に失われてしまったことから回復する方法があるかどうか疑問に思っています。 メッセージ全体を再送信するというもう1つの提案は、私が検討しているもう1つのアプローチです。 – dshpak

+0

興味深い回答;-) – Thomas

関連する問題