0

SQL Serverの次のテーブルについて考えてみます。タスク(Payload nvarchar、DateToExecute datetime、DateExecuted datetime null)

これで、2つのワーカープロセス(この場合は2つのAzureワーカーロールインスタンス)ができました。どちらも、 DateExecutedがNULLでDateToExecute <= GETDATE()であるレコードを定期的に取得しようとします。次に、そのレコードを処理し、(SQL更新)DateExecutedを現在の日付に設定します。

問題は、単一のタスクが単一のワーカーインスタンスによって一度だけ処理される必要があることです。

そのようなシナリオを実装するための同期またはロックを提供するための最良の方法は何ですか?

4

1 に答える 1

1

Windows Azureで複数のロール/インスタンスをロックする最も簡単な方法は、BLOBリースを使用することです。Steve Marxは、AutoRenewLease(ソースNuGetブログ投稿)と呼ばれるこのための優れたクラスを作成しました。すでにタイマーまたはwhileループがある場合は、次のようなコードを記述できます。

using (var arl = new AutoRenewLease(leaseBlob))
{
    if (arl.HasLease)
    {
        // Query Tasks table and do work....
    }
    else 
    {
        // Other worker is busy....
    }
}

または、X分ごとにコードをスケジュールできるDoEveryメソッドを使用することもできます。

AutoRenewLease.DoEvery(leaseBlob, TimeSpan.FromMinutes(15), () => {
    // Query Tasks table and do work....
});
于 2012-12-03T13:39:57.377 に答える