ワーカーロールがのようなPKを使用して、完了した各ジョブの詳細をテーブルに書き込む場合、(DateTime.MaxValue - DateTime.UtcNow).Ticks.ToString("d19")
処理された最新のジョブのソートされたリストがあります。次のようにテーブルをポーリングするようにWebロールを設定します。
var q = ctx.CreateQuery<LatestJobs>("jobstable")
.Where(j => j.PartitionKey.CompareTo(LastIndexTime.GetReverseTicks()) < 0)
.Take(1)
.AsTableServiceQuery()
if (q.Count() > 0)
{
//new jobs exist since last check... re-index.
}
インデックス作成作業を行うワーカーロールの場合、競合を心配することなくテーブルに無差別に書き込むことができるため、これは優れています。あなたのために、あなたは彼らが処理している仕事の監査ログも持っています(あなたがそこにいくつかの詳細を入れていると仮定して)。
ただし、残りの問題が1つあります。インデックスを更新するWebロールが1つあるようです。もちろん、この1つのWebロールは、選択した頻度でこのテーブルをポーリングできます(後で検索するためにLastIndexTimeを追跡するだけです)。問題は、複数ある場合にWebロールの同時実行性を制御する方法です。各Webロールは独自のインデックスを維持していますか、それともすべての場所にインデックスを保存していますか?申し訳ありませんが、それが明らかな場合、私はLuceneの専門家ではありません。
とにかく、WebRoleに複数のインスタンスがあり、すべてが表示できる単一のインデックスがある場合は、複数のロールがインデックスを何度も更新しないようにする必要があります。これは、インデックスをリースすることで実行できます(blobストレージに格納されている場合)。
コメントに基づいて更新:
各WebRoleインスタンスに独自のインデックスがある場合は、リースについて心配する必要はありません。これは、BLOBリソースを一緒に共有している場合のみです。したがって、この手法はそのままで正常に機能するはずです。唯一の潜在的な障害は、Webロールのポーリング間隔がわずかに同期しておらず、すべての更新まで(ヒットしたインスタンスに応じて)結果が多少異なる可能性があることです。テーブルで30秒ごとにポーリングすると、最大で同期がとれなくなります。各Webロールインスタンスは、最後に更新された時刻を追跡し、その時点から増分検索を実行する必要があります。