1

SQL Azure データベースに対してコードを定期的に実行する Azure ワーカー ロールがあります。これが私の現在のコードです:

const int oneHour = 216000000; // milliseconds

while (true)
{
    var numConversions = SaveSeedsToSQL.ConvertRemainingPotentialQueryURLsToSeeds();
    SaveLogEntryToSQL.Save(new LogEntry { Count = numConversions });
    Thread.Sleep(oneHour);
}

Thread.Sleep(216000000) は、このような定期的ではあるが頻度の低いイベントをプログラミングするための最良の方法ですか? それとも、利用すべき Azure ワーカー ロールのウェイクアップと再実行のメカニズムのようなものはありますか?

4

1 に答える 1

3

もちろん、このコードは機能しますが、いくつかの問題があります。

  1. どこかで失敗する可能性があり、このスケジュールはすべて破棄されます。特定の時間に実際に実行する必要がある場合、これは重要です。
  2. ここには同時実行制御はありません。何かを 1 回だけ実行したい場合は、1 つのインスタンスがその作業を実行し、他のインスタンスは実行しないようなメカニズムが必要です。

この問題にはいくつかの解決策があります。

  • ロールで Windows スケジューラを実行します (組み込み)。これで問題 1 は解決しますが、2 は解決しません。
  • Quartz.NET を実行してスケジュールを設定します。それは#1を解決し、方法によっては#2も解決します。
  • Service Bus または Windows Azure キューのいずれかで、将来スケジュールされたキュー メッセージを使用します。それは両方を解決します。

最初の 2 つのオプションは警告付きで機能するため、最後のオプションはもっと注目に値すると思います。ロールが理解するメッセージを作成してキューに投稿するだけです。時が来れば、それは見えるようになり、あなたの通常のポーリングの役割はそれを見て、それに取り組むことができます。ここでの利点は、キュー メッセージであるため、時刻が正確であり、単一のインスタンスが動作することです。作業が完了したら、インスタンスに次のスケジュールを設定させ、それをキューに投稿できます。私たちは常にこの技術を使用しています。次のロールをスケジュールする前に何らかの理由でロールが失敗した場合、システム全体が失敗することに注意する必要があります。そこには、いくつかのサニティチェックとセーフガードが必要です。

于 2012-06-25T14:16:19.887 に答える