programing

AppFabric이 다시 시작해도 제대로 복구되지 않음

copysource 2023. 6. 4. 18:33
반응형

AppFabric이 다시 시작해도 제대로 복구되지 않음

좋아요. 앱 패브릭을 성공적으로 구축했고 웹 사이트에서 간헐적인 예외가 발생하기 전까지는 모든 것이 잘 작동했습니다.

오류 코드 < ERRCA0017 >:SubStatus < ES0007 >:일시적으로 오류가 발생했습니다.나중에 다시 시도하십시오.(서버가 제한된 상태이기 때문에 요청에 실패했습니다.)

처음에는 서버의 메모리가 부족하다고 생각했지만(제한된 상태), 결국 문제가 아니라고 결론 내렸습니다.이벤트 로그에서 Distributed CacheService를 찾았습니다.exe가 가끔 다운되는 바람에 로컬 개발 환경에서 오류를 재현할 수 있는 간단한 방법이 생겼습니다.

  • 웹 사이트를 시작하고 캐시에 몇 가지 사항을 추가합니다.
  • "AppFabric Caching Service"를 다시 시작합니다.
  • 그리고 저는 오류를 이해하기 시작합니다.

내가 만약에Get-CacheClusterHealth서비스를 다시 시작하기 전에 다음과 같이 표시됩니다.

NamedCache = MyCacheName
    Healthy              = 100,00
    UnderReconfiguration = 0,00
    NotPrimary           = 0,00
    NoWriteQuorum        = 0,00
    Throttled            = 0,00

다시 시작한 후:

Unallocated named cache fractions
---------------------------------

NamedCache = MyCacheName
    Unallocated fraction     = 100,00

내가 그 결과를 얻는 동안에.Get-CacheClusterHealth사이트가 실패합니다.제가 알기로는 시간이 지나면(10분 이상) 저절로 고쳐지는 것 같습니다.

AppFabric을 더 빨리 복구할 수 있는 방법이 있습니까?

간단히 말해서 대답은 아니오입니다.

노드를 추가하면 클러스터를 다시 시작하는 데 걸리는 시간이 늘어남에 따라 노드 동기화 프로세스에 시간이 걸리는 것으로 판단됩니다.

예외적으로 appfabric 노드가 제한된 상태로 전환됩니다.노드에서 상한/낮은 워터마크를 설정하는 방법에 따라 조절된 상태로 전환됩니다.저는 기본적으로 이 시간 이후에 캐시에 설정된 퇴거 정책에 따라 항목을 퇴거하기 시작하는 최고 수위가 90%라고 생각합니다.일반적으로 LRU(최소한 최근에 사용됨)를 사용해야 하지만 캐시가 여전히 설정된 제한 내에서 실행될 수 없는 경우 서버가 다운되지 않도록 스스로 조절합니다.

귀하의 애플리케이션이 이러한 이벤트를 우아하게 처리할 수 있다면 도움이 될 것입니다.앱의 클러스터 구성에 모든 노드가 나열되어 있는 경우 다음 번에 데이터를 가져올 때 앱이 다음 노드로 이동해야 합니다.우리는 일시적인 오류를 찾고 3번 재시도하는 재시도 루프를 사용합니다.3번의 오류가 지속되면 로그를 기록하고 예외가 아닌 null을 반환합니다.이를 통해 응용 프로그램은 다른 노드에 액세스하거나 문제가 발생한 노드 시간을 복구할 수 있습니다.

 private object WithRetry(Func<object> method)
    {
        int tryCount = 0;
        bool done = false;
        object result = null;
        do
        {
            try
            {
                result = method();
                done = true;
            }
            catch (DataCacheException ex)
            {
                if (ex.ErrorCode == DataCacheErrorCode.KeyDoesNotExist)
                {
                    done = true;
                }
                else if ((ex.ErrorCode == DataCacheErrorCode.Timeout ||
                ex.ErrorCode == DataCacheErrorCode.RetryLater ||
                ex.ErrorCode == DataCacheErrorCode.ConnectionTerminated)
                && tryCount < MaxTryCount)
                {                        
                    tryCount++;
                    LogRetryException(ex, tryCount);
                }
                else
                {
                    LogException(ex);
                    done = true;
                }
            }
        }
        while (!done);


 return result;
}

이를 통해 다음과 같은 작업을 수행할 수 있습니다.

private void AF_Put(string key, object value)
{
    WithRetry(() => defaultCache.Put(key, value));
}

또는:

private object AF_Get(string key)
{
    return WithRetry(() => defaultCache.Get(key));            
}

이와 같은/유사한 문제가 제가 작업한 프로젝트 중 하나에서 발생했습니다.2주 동안 머리를 긁적이며 WCF 서비스를 Azure에서 실행하기 위해 모든 것을 시도했지만 실패한 후 결국 Microsoft에 전화를 걸었습니다.

마이크로소프트의 기술자들은 우리에게 (파워)를 제공했습니다.AppFabric의 상태+유지 관리를 수행하는 사이트의 런타임에서 실행되는 셸 스크립트...그 대본은 제가 애저 책에서 전혀 보지 못했던 것들을 가지고 있었지만, 그것은 일을 제대로 해냈습니다!

감사해요.

언급URL : https://stackoverflow.com/questions/7483498/appfabric-doesn-t-recover-well-from-restart

반응형