5 つの Web サーバー間で負荷分散された約 50 の Web サイトがあります。それらはすべて Enterprise Library Caching を使用し、同じ Caching データベースにアクセスします。キャッシュ データベース内のアイテムは、ICacheItemRefreshAction 実装を使用して、数時間ごとに更新されます。
更新コードをクリティカル セクションに配置することで、1 つの Web サイトのみがキャッシュを更新することを保証したいと考えています。
Web サイトが単一のサーバー上の単一のアプリケーション プールで実行されている場合、lock()を使用できます。
Web サイトが単一サーバー上の個別のアプリケーション プールで実行されている場合、Mutexを使用できます。
ただし、これらは複数の Web サーバーにまたがるクリティカル セクションを保証しません。
現在、キャッシュ データベースにミューテックスとして機能する新しいキーを作成しています。これは通常は機能しますが、2 つのプロセスがクリティカル セクションに入る可能性はほとんどありません。
public class TakeLongTimeToRefresh : ICacheItemRefreshAction
{
#region ICacheItemRefreshAction Members
public void Refresh(string removedKey, object expiredValue, CacheItemRemovedReason removalReason)
{
string lockKey = "lockKey";
ICacheManager cm = CacheFactory.GetCacheManager();
if (!cm.Contains(lockKey))
{
Debug.WriteLine("Entering critical section");
// Add a lock-key which will never expire for synchronisation.
// I can see a small window of opportunity for another process to enter
// the critical section here...
cm.Add(lockKey, lockKey,
CacheItemPriority.NotRemovable, null,
new NeverExpired());
object newValue = SomeLengthyWebserviceCall();
cm.Remove(removedKey);
Utilities.AddToCache(removedKey, newValue);
cm.Remove("lockkey");
}
}
}
Web サービスを 2 回呼び出さないように、クリティカル セクションを保証する方法はありますか?
編集展開ポリシーによって禁止されるため、共有ファイルを使用できないことを追加する必要があります。
StackOverflow 参照: