我有大约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