2014-02-05 5 views
0

우리는 1 년 넘게 couchbase로 일하고 있으며 .Net SDK로 작업을 개선하고 싶습니다.CouchbaseClient를 사용하는 모범 사례

웹 사이트에서 get/set을 사용하는 가장 좋은 방법에 대한 권장 사항을 찾을 수 없습니다.

나는 이것을 사용하려고 할 때 : CouchbaseClient.Get(key), 실패 할 수 있습니다. 그리고 우리는 X 시간 동안 기다렸다가 다시 시도해야합니다.

get/set 프로세스를 수행 할 때 대기 시간에 가장 좋은 방법이 무엇인지 이해하고 싶습니다.

이 문제가 발생한 사람은 누구나 알려 주실 수 있습니까?

답변

2

일반적으로 ExecuteXXX를 사용하는 것이 좋습니다. 여기서 XXX는 정규/구형 Get 또는 Set 메서드와 달리 연산 메서드입니다. 그 이유는이 메소드가 작업에 대한 추가 정보를 반환하고이 정보를 사용하여 재시도 전략을 조정할 수 있기 때문입니다.

자세한 내용은 문서의이 부분을 읽어 http://docs.couchbase.com/couchbase-sdk-net-1.3/#working-with-operation-results-and-error-codes

+0

XXX 대신 ExecuteXXX를 사용하면 성능에 어떤 영향이 있습니까? 내가 읽었던 couchbase 문서에서 오류 코드를 처리하는 방법에 대한 정보 나 샘플이 없습니다. 예 : 언제 기다려야하고 다시 시도해야합니까? 몇 번이나해야합니까? – FelProNet

+1

성능 효과를 위해, 거의 아무것도; 서버와 클라이언트에서 이미 사용할 수있는 정보를 가진 객체 만 반환하면됩니다. – jeffrymorris

+0

감사합니다. Jeff. 공연 후에 질문 한 다른 질문에 대한 답변이 있습니까? – FelProNet

2

나는 자바와 루비를 Couchbase와 함께 사용할 때만 .net 클라이언트를 사용하지 않았지만 상위 개념은 같을 것입니다.

get 작업이 실패 할 수 있다고 말하면 많이 실패합니다. 스마트 클라이언트가 클러스터와 적시에 통신하지 못하거나 대기열이 새 요청을 수용하기에 너무 꽉 찼을 때 (매우 드물기 때문에) 몇 가지 예외를 처리해야합니다.

호출을 감싸고 (get/set/add) 특정 예외를 잡으면 시스템의 요구 사항에 따라 다릅니다. 전체 큐에 도달하는 경우 요청을 여러 번 다시 시도하면 상황이 악화됩니다. 예외가 발생한 경우 반환 할 수있는 기본값이 없습니까?

우리의 응용 프로그램 (REST API)에서 시간 초과 문제가 발생하면 나중에 다시 시도하도록 사용자에게 알리는 사용자 정의 예외가 발생합니다.

재시도해야하는 비즈니스 요구 사항이있는 경우 시간 제한을 확인하고 요청을 대기열에 배치하거나 특정 재 시도 전략을 호출해야합니다.

두 가지 예외 중 하나라도 잡는다면 시스템이 다운되거나 곧 중단 될 것이라는 신호일 수 있으므로 신중하게 모니터링하십시오. Couchbase 문서의이 페이지는 문제를 아주 잘 다루고 있다고 생각합니다.

https://www.couchbase.com/docs/couchbase-devguide-2.0/about-client-timeouts.html

그리고 C#을 특정 SDK를 좀 더 세부 원래의 질문에 확장 주시기하지 않을 경우이, 도움이되기를 바랍니다 http://www.couchbase.com/docs/couchbase-sdk-net-1.2/couchbase-sdk-net-configuration.html

에 대한 문서.

+0

조금 도움이됩니다. 내가 게시 한 첫 번째 링크를 찾지 못했기 때문에 읽을 거리가 좋습니다. 하지만 다른 것을 묻고 싶습니다. 앱에서 get 작업을 실행하고 오류가 발생하는 경우 두 시간 (수분 또는 초) 동안 다시 잠자기를 시도합니까? – FelProNet

+0

아니요 a) 우리 요구 사항 때문에 요청하지 마십시오. (위 참조) 및 b) 대기열 전체 예외를 잡는 경우에는 어떻게됩니까? 잠재적으로 실패한 노드/클러스터에 더 많은로드를 가하게됩니다. 즉시 회신 할 필요가없는 경우 페이로드를 대기열에 띄우고 클러스터가 정상적으로 작동하는지 확인하면 서비스를 다시 시도하십시오. 작업 중에 많은 오류가 발생하지 않아야합니다. – scalabilitysolved

0

감사합니다 여기에 대한 대답.그 답변 난이 포럼에서 발견 좋은 포스트

: 이것은 단지 예이며

  public static TResult Do<T,TResult>(Func<T,TResult> action, T param, TimeSpan retryInterval, int retryCount = 3) 
      { 
       for (int retry = 0; retry < retryCount; retry++) 
       { 
        try 
        { 
         return action(param); 
        } 
        catch (RetryOperationException) 
        { 
         Log.SaveFormat("Retry:{0} for action:{1}", "RetryProcessLog",retry, action.Method.Name); 
         Thread.Sleep(retryInterval); 
        } 
        catch (Exception ex) 
        { 
         Log.SaveFormat("Exception when retry:{0} error:{1}","RetryProcessLog",action.Method.Name,ex.Message); 
         return default(TResult); 
        } 
       } 

       return default(TResult); 
      } 

     public static T ExecuteGet<T>(string key) 
     { 
      var defaultReturnValue = default(T); 

      cacheHit("ExecuteGet", key); 

      var result = CacheClient.ExecuteGet<T>(CachePrefix + key); 

      if (result.Success) 
      { 
       return result.Value; 
      } 
      else if (result.StatusCode == 
        CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.Busy) 
        || 
        result.StatusCode == 
        CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.TemporaryFailure) 
        || 
        result.StatusCode == 
        CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.SocketPoolTimeout) 
        || 
        result.StatusCode == 
        CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.UnableToLocateNode) 
        || 
        result.StatusCode == 
        CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.NodeShutdown) 
        || 
        result.StatusCode == 
        CouchbaseStatusCode.StatusCodeExtension.ToInt(CouchbaseStatusCode.StatusCode.OperationTimeout)) 
      { 
       Log.SaveFormat("Error:{0}:{2} in ExecuteGet for key:{1}. Going to throw RetryOperationException", 
           "CacheManager", result.StatusCode, key,result.Message); 
       throw new RetryOperationException(); 
      } 

      Log.SaveFormat("Error:{0}:{2} in ExecuteGet for key:{1}", "CacheManager", result.StatusCode, key,result.Message); 
      return defaultReturnValue; 
     } 

: 여기 Retry process

나는 몇 가지 코드를 작성하고 그 방법 중 하나에 대한 예입니다 둘 이상의 매개 변수 또는 다른 메서드를 반환 값없이 가져 오는 메서드 오버로드를 추가 할 수 있습니다. 두 번째 방법은 다른 클래스에 있고 ExecuteGet을 사용합니다.

var result = RetryProcess.Do(CacheManager.ExecuteGet<long>, keyOfValue, TimeSpan.FromMilliseconds(10)); 

는 희망이 도움이 :

그리고 여기는 사용의 예입니다.