5 개의 웹 서버에 부하가 분산 된 약 50 개의 웹 사이트가 있습니다. 이들은 모두 엔터프라이즈 라이브러리 캐싱을 사용하고 동일한 캐싱 데이터베이스에 액세스합니다. 캐싱 데이터베이스의 항목은 ICacheItemRefreshAction 구현을 사용하여 몇 시간마다 새로 고쳐집니다.웹 팜의 분산 된 중요 섹션
critical section에 새로 고침 코드를 넣으면 웹 사이트 하나만 캐시를 새로 고칠 수 있습니다. 웹 사이트를 하나의 서버에 하나의 응용 프로그램 풀에서 실행중인 경우 웹 사이트 하나에 별도의 앱 풀에서 실행중인 경우
그러나 이것들은 여러 웹 서버의 중요한 섹션을 보장하지 않습니다.
현재 캐싱 데이터베이스에 뮤텍스의 역할을하는 새 키를 만듭니다. 이것은 일반적으로 일이 될 것이지만, 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");
}
}
}
있습니까?
EDIT 배포 정책으로 인해 공유 파일을 사용할 수 없다고 추가해야합니다.
StackOverflow의 참조가 :
어떤 종류의 토큰 링 시스템일까요? – jp2code