我有大約50個網站,跨5個網絡服務器負載平衡。他們都使用企業庫緩存,並訪問相同的緩存數據庫。高速緩存數據庫中的項目每隔幾個小時刷新一次,使用ICacheItemRefreshAction實現。網絡農場中的分佈式臨界區域
我想通過將刷新代碼放在critical section中來保證只有一個網站刷新緩存。
但是,這些將不能確保跨多個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服務兩次的一種方式?
編輯我應該補充一點,我不能使用共享文件,因爲部署策略會阻止它。
StackOverflow的引用:
也許某種令牌環系統? – jp2code 2011-03-18 15:53:32