2016-09-26 7 views
0

私はAzure Queueからのメッセージを消費するワーカーロールをバックグラウンドで処理しています。ここで指定されたメッセージは存在しません。 ErrorCode:MessageNotFound Prod-WorkerError Context

System.Net.WebException Microsoft.WindowsAzure.Storage.StorageException Exception messages: The remote server returned an error: (404) Not Found. The remote server returned an error: (404) Not Found. Stack Traces: at System.Net.HttpWebRequest.GetResponse() at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand 1 cmd, IRetryPolicy policy, OperationContext operationContext) --- Next Call Stack: at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand 1 cmd, IRetryPolicy policy, OperationContext operationContext) at Microsoft.WindowsAzure.Storage.Queue.CloudQueue.DeleteMessage(String messageId, String popReceipt, QueueRequestOptions options, OperationContext operationContext) at InnovativeExams.Azure.CloudStorage.AzureQueue`1.DeleteMessage(T message) The specified message does not exist. ErrorCode:MessageNotFound Prod-WorkerError Context

:私は私のログを確認すると は、メッセージを処理するが、それでも私のログに、私は次の例外(だけ長いエラー・ログから関連するテキストの一部を貼り付け)を取得しながら、例外が記録されないことがあるように見えます作業者ロールにあるコードです:

private void ProcessQueueMessage(object queueMessageToProcess) 
     { 
      var queueMessage = queueMessageToProcess as EventCompletedQueueMessage; 

      try 
      { 
       if (_eventCompletedProcessor.Process(queueMessage)) 
        _azureQueue.DeleteMessage(queueMessage); 
      } 
      catch (Exception ex) 
      { 
       _logger.LogError(string.Format("Event Completed message <{0}> was not processed due to an exception", queueMessage.Id), ex, LogSources.WorkerRole_EventCompletedDispatcher); 
      } 
     } 

上記の例外は、上記のcatchブロックで捕捉され、記録されます。

作業者の役割がキュー内のメッセージを削除しようとしたときにメッセージが見つからないときに問題があると思います。

このエラーを解決し、ここで何が問題になっているのかを知る助けが必要です。コメントに尋ね

いくつかの質問:

1)あなたのWorkerロールの複数のインスタンスを実行していますか?

A:これは既存のアプリケーションであり、ThreadPoolを使用して、事前にインスタンス化することができます。

2)どのように作業者の役割でメッセージを「取得していますか?どのインスタンスがメッセージを受け取るかを決めるために、ある種のリーダー選挙パターンを使用していますか?

A:はい処理するQueueMessageの適切なディスパッチャを決定するフレームワークがあります。

3)メッセージを受け取ったとき、そのメッセージの表示時間のタイムアウトはどのくらいですか?

A:あなたはすなわち、どのくらいの時間メッセージを取得し、メッセージを削除する間、これらのメッセージを処理するために120

4)へのセットがどのくらいの時間がかかりますか?

A:これについてはわかりません。

+0

ごくわずかです(質問をこれらの回答に更新してください):1)あなたのワーカーロールの複数のインスタンスを実行していますか? 2)あなたはどのようにあなたの職員の役割のメッセージを「取得していますか?どのインスタンスがメッセージを受け取るかを決めるために、ある種のリーダー選挙パターンを使用していますか? 3)メッセージを受け取ったとき、そのメッセージの可視性のタイムアウトは何ですか? 4)これらのメッセージを処理するにはどのくらいの時間がかかります。つまり、メッセージを取得してからメッセージを削除するまでにどれくらい時間がかかりますか? –

+0

@GauravMantriが質問を編集しました。チェックしてください。 – Maninder

答えて

2

あなたが遭遇しているエラーがどのような状況で起こるかを説明しましょう。

Azure用語でGET Messagesというメッセージをデキューすると、Azure Queue Serviceはpopreceiptというものを返します。これはメッセージの削除や更新に使用する必要があります。このpopreceiptは、同じメッセージが再びデキューされるまで有効な、不透明な値です(つまり、ビジネスロジックを構築しないでください)。メッセージが再びデキューされると、popreceiptの新しい値が取得され、この新しい値を使用してメッセージを削除または更新する必要があります。

メッセージがもう一度デキューされている間に古いpopreceipt値を使用してメッセージを削除しようとすると、エラーが発生します。

私の推測では、これはアプリケーションで起こっていることです。これが事実であるかどうか確認してください:

ワーカーロールインスタンスの1つがメッセージをデキューし、そのメッセージで作業を開始します。上記の内容に基づいて、メッセージをデキューすると120秒間メッセージが非表示になります。私は、メッセージの処理に要した実際の時間が120秒を超えていると仮定しているため、メッセージはキューに再び表示されます。このメッセージをデキューするもう1つのプロセスがあります(したがって、新しいpopreceiptを取得します)。しかし、2番目のプロセスがメッセージをデキューした直後に、1番目のプロセスはメッセージの作業を終了し、今度はpopreceiptを使用してメッセージを削除します。このpopreceiptはもはや有効ではないので、このpopreceiptを使用してそのメッセージに対して削除操作を実行しようとすると、message not foundエラーが発生します。

+0

PopReceiptの詳細を説明してくれたGauravに感謝します。私も同じ状況を想定していましたが、これを深く知りませんでした。 ストップウォッチを追加してから、メッセージの処理にどれくらいの時間がかかり、それに応じてキューの可視性が更新されます。 – Maninder

関連する問題