1

Task Parallel Library と Azure インスタンスに関連する問題を解決するための助けが必要です。以下は、私の Worker Role のコードです。

複数のファイルをアップロードするたびに、リクエストがキューに挿入され、ワー​​カー プロセスが継続的にクエリを処理してメッセージを取得します。メッセージが取得されたら、長時間実行されるプロセスを実行します。複数のリクエストが複数のインスタンスの複数のタスクインスタンスによって処理されるように、タスクスケジューラを使用しました。

ここで、あるインスタンスがキューからメッセージを取得し、そのメッセージをタスクに割り当てて処理すると、別のインスタンスもキューから同じメッセージを取得して処理することがわかります。そのため、私のタスクは複数回実行されます。

この問題で私を助けてください。私の要件は、1 つの Ccre の 1 つの Azure インスタンスのみが、タスクごとに複数ではなく、1 つのタスク操作を処理することです。

public override void Run()
{
//Step1 : Get the message from Queue

//Step 2:  
Task<string>.Factory.StartNew(() =>
                            {
                              //Message delete from Queue
                  PopulateBlobtoTable(uri, localStoragePath);

                                        }
                                        catch (Exception ex)
                                        {
                                            Trace.WriteLine(ex.Message);
                                            throw;
                                        }
                                        finally
                                        {

                                        }
                                    }
                                    return "Finished!";                                    
                            })

                            catch (AggregateException ae)
                            {
                                foreach (var exception in ae.InnerExceptions)
                                {
                                    Trace.WriteLine(exception.Message);
                                }
                            }
4

2 に答える 2

2

ストレージクライアントAPIを使用する場合、デフォルトの非表示タイムアウトが90秒のWindowsAzureストレージキューを使用していると想定しています。メッセージが完全に処理されておらず、その期間内に 明示的に削除されていない場合、メッセージはキューに再表示されます。

メッセージをキューに追加するときに、この非表示のタイムアウトを最大7日間まで増やすことができますが、べき等の操作を使用する必要がありますつまり、メッセージが複数回処理されるかどうかは関係ありません。べき等性を確保するのはあなたの仕事です。おそらく、各メッセージに関連付けられた一意のID(テーブルストレージ、SQLデータベースなど)を記録し、2回目に表示され、すでに完了とマークされていることがわかった場合は、メッセージを無視します。

また、WindowsAzureキューとWindowsAzureサービスバスキュー-比較と制約も確認できます。Service Busキューには、最大1回(および少なくとも1回)の配信を保証するために使用できる追加の構成がいくつかあることに注意してください。

于 2012-09-23T22:34:21.337 に答える
0

ここでの問題は、1つのインスタンスがキューからメッセージを取得し、そのメッセージをタスクに割り当てて処理する場合です。別のインスタンスも同じメッセージをキューから取得して処理することがわかります。そのため、私のタスクは複数回実行されます。

「GET」セマンティクスを介してメッセージを取得していますか?その場合、メッセージに設定した可視性タイムアウトはどれくらいですか。メッセージを「GET」すると、可視性タイムアウト期間を使用して指定できる特定の期間、他の呼び出し元(この場合は「インスタンス」を参照)からは見えなくなるはずです。これについては、こちらのドキュメントを確認してください:http: //msdn.microsoft.com/en-us/library/windowsazure/ee758454.aspx

于 2012-09-24T05:05:53.680 に答える