2012-03-20 4 views
6

클라이언트가 Redis에 문서가 있는지 확인하고 패턴이 아닌 경우 데이터베이스에서 데이터를 가져 오는 패턴을 구현합니다.ServiceStack Redis Client를 타임 아웃으로 구현하는 방법

우리는 Redis 서버가 작동하지 않거나 도달 할 수없는 경우를 처리하여 데이터베이스에서 즉시 가져올 수 있습니다.

그러나 Redis 서버를 의도적으로 중단하여 코드를 테스트하면 ServiceStack 클라이언트를 통한 Redis 호출이 약 20 초 동안 시간 초과되지 않습니다.

RedisClient .SendTimeout 속성을 다양한 값 (1000, 100, 1)으로 사용하려고했지만 시간 제한은 약 20 초 후에 항상 발생합니다. 또한 .Ping() 메서드를 사용했지만 동일한 문제가 발생했습니다.

질문 : Redis 서버가 다운 된 상황을 어떻게 처리하여 DB 반입을 더 빨리 전환 할 수 있습니까?

답변

0

플랜 B로 전환하기 전에 요청을 기다려야하는 시간을 알려주는 redis 서버에 의존해서는 안됩니다. 요청을 실행하는 코드에이 논리를 넣어서 redis 서버가 설정되는 방식과는 독립적입니다.

1

나는 전자 메일을 보내는 것과 비슷한 문제가있다. 때로는 응답이 없으며 (SmtpClient의) 빌드 인 타임 아웃은 아무 것도하지 않는다. 결국 나는 기본 TCP/IP 계층에서 오는 것으로 생각되는 시간 제한을 얻게됩니다. 클라이언트의 타임 아웃을 Task.Wait의 "잔인한 타임 아웃"보다 약간 짧게 설정했습니다. 내 솔루션

는 작업에 전화를 포장하고, 그에 타임 아웃을 사용하는 것이었다 :

 // this special construct is to set a timeout (the SmtpClient timeout does not seem to work) 
     var task = Task.Factory.StartNew(() => SendEmail(request)); 

     if (!task.Wait(6000)) 
      Log.Error("Could not send mail to {0}. Timeout (probably on TCP layer).".Fmt(request.To)); 

어쩌면, 당신을 위해 작동 단지 레디 스의 일을하는 방법으로 SendEmail을 대체 할 유사한.

관련 문제