2015-01-06 5 views
4

지난 1 주 정도 Azure SQL 데이터베이스에서 일시적 오류 처리를 구현하려고 시도했습니다. DB에 대한 작업 연결이 있지만 예상대로 일시적인 오류를 처리하고 있다고 확신하지는 않습니다.일시적인 오류 처리 (Azure)의 올바른 구현

지금까지 나의 접근 방식은 나는 Global.asax 년대에서 Application_Start()을 그 메소드를 호출

public static void SetRetryStratPol() 
{ 
    const string defaultRetryStrategyName = "default"; 

    var strategy = new Incremental(defaultRetryStrategyName, 3, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2)); 
    var strategies = new List<RetryStrategy> { strategy }; 
    var manager = new RetryManager(strategies, defaultRetryStrategyName); 
    RetryManager.SetDefault(manager); 
    retryPolicy = new RetryPolicy<SqlDatabaseTransientErrorDetectionStrategy>(strategy); 
    retryPolicy.Retrying += (obj, eventArgs) => 
          { 
           var msg = String.Format("Retrying, CurrentRetryCount = {0} , Delay = {1}, Exception = {2}", eventArgs.CurrentRetryCount, eventArgs.Delay, eventArgs.LastException.Message); 
           System.Diagnostics.Debug.WriteLine(msg); 
          }; 
} 

을 포함하고있다. [ retryPolicy의이 다음 방법을 포함한다 정적 클래스에 글로벌 정적 변수이다.]

이 그때 그때까지이 방법

using (var conn = GetReliableConnection()) 
using (var cmd = conn.CreateCommand()) 
{ 
    cmd.CommandText = "SELECT COUNT(*) FROM ReliabilityTest"; 

    result = (int) cmd.ExecuteScalarWithRetry(); 

    return View(result); 
} 

를 사용하는 방법

public static ReliableSqlConnection GetReliableConnection() 
{ 
    var conn = new ReliableSqlConnection("Server=...,1433;Database=...;User ID=...;Password=...;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;", retryPolicy); 

    conn.Open(); 

    return conn; 
} 

을 가지고 이 작품. 그런 다음 재시도 정책을 테스트하기 위해 잘못된 사용자 이름 (here의 제안)을 사용해 보았습니다.

하지만 그 코드를 단계별로 때 커서가 즉시

로그인 내 catch 문으로 이동 '은 [내 이름]'사용자가 실패했습니다.

나는이 예외가 몇 초 후에 만 ​​잡힐 것으로 예상했지만 지연은 전혀 발생하지 않았습니다.

또한, 정확하게 this post 다음에 Entity Framework를 사용해 보았지만 같은 결과가 나옵니다.

내가 무엇을 놓쳤는가? 구성 단계가 있습니까? 아니면 일시적인 오류를 잘못 유도합니까?

답변

11

일시적 오류 처리 블록은 일시적 오류를 처리하기위한 것입니다. 잘못된 사용자 이름/암호로 인해 실패한 로그인은 확실히 그 중 하나가 아닙니다. 이 웹 페이지에서 : http://msdn.microsoft.com/en-us/library/dn440719%28v=pandp.60%29.aspx :

일시적 결함이란 무엇입니까? 응용 프로그램이 서비스를 사용하는 경우

오류는 간헐적 인 서비스, 인프라 수준의 고장, 네트워크 문제 또는 서비스에 의해 명시 적 제한으로 인해 일시적인 조건을 발생할 수 있습니다; 이러한 유형의 오류는 클라우드 기반 서비스에서 더 자주 발생하지만 온 - 프레미스 솔루션에서도 발생할 수 있습니다. 잠시 후에 작업을 다시 시도하면 (아마도 밀리 초 후에 만) 작업이 성공할 수 있습니다. 이러한 유형의 오류 조건을 일시적인 오류라고합니다. 일시적인 결함 은 일반적으로 매우 드물게 발생하며 대부분의 경우 작업이 성공하려면 몇 분의 번의 재시도가 필요합니다.

이 응용 프로그램 블록 (http://topaz.codeplex.com/)의 소스 코드를 확인하고 SQL 데이터베이스에서 반환 된 오류 코드가 일시적인 오류로 간주되어 재 시도가 필요할 수 있습니다.

코드를 테스트하기 위해 일시적 오류 중 하나로 기능을 확장하고 실패한 로그인을 포함 할 수 있습니다. http://topaz.codeplex.com/SourceControl/latest#source/Source/TransientFaultHandling.Data/SqlDatabaseTransientErrorDetectionStrategy.cs :

UPDATE

여기에 소스 코드를 살펴 않습니다. 여기서 재시험 마법이 발생합니다. 당신이 할 수있는 일은 클래스를 생성하고 (이 코드를 CustomSqlDatabaseTransientErrorDetectionStrategy이라고 부름) 링크에서이 코드로 전체 코드를 복사하는 것입니다. 그런 다음 테스트 목적으로 login failed 시나리오를 일시적인 오류 중 하나로 추가하고 SqlDatabaseTransientErrorDetectionStrategy 대신 애플리케이션에서이 클래스를 사용할 수 있습니다.

+0

이것은 내 의혹 중 하나입니다. 그러나이 질문에서 언급 한 블로그 게시물은 6 개월 전 Azure MVP에 의해 작성되었으며 사용자 이름을 변경하여 재시도 정책을 유도 한 다음이 변경이 재시도 정책을 호출했다는 증거를 제공합니다. Transient Fault Handling에 대한 경험이 있으십니까? 다른 방법으로 테스트해볼 수 있습니까? – awj

+0

내 대답이 업데이트되었습니다. HTH. –

+0

소스 코드를 둘러 보았지만 찾지 못했습니다. 링크 덕분입니다. 나는 당신이 제안한 것처럼했고 내가 호출 한 오류 코드가 일시적인 오류로 간주되는 유형이 아니라는 사실을 발견했습니다. 그러나 RetryStrategy에 따라 IsTransient 메소드를 반복적으로 사용하고 있음을 알 수있었습니다. 그래서 ... 나는 지금 나의 OP의 코드가 유효하다는 것을 매우 만족하고 있으며, 나는 단지 그것을 잘못 트리거하고 검증하려고 시도하고있었습니다. 당신의 도움을 주셔서 감사합니다. – awj