2012-03-20 16 views
6

Estamos implementando un patrón en el que nuestro cliente verifica si existe un documento en Redis, y si no lo hace, entonces buscamos los datos de la base de datos.Cómo implementar ServiceStack Redis Client con tiempo de espera

Estamos tratando de manejar un caso en el que el servidor de Redis está inactivo o inaccesible, por lo que podemos obtener inmediatamente de la base de datos.

Sin embargo, cuando probamos nuestro código eliminando intencionalmente el servidor Redis, la llamada a Redis a través del cliente ServiceStack no tiene un tiempo de espera de aproximadamente 20 segundos.

Intentamos usar la propiedad .SendTimeout de RedisClient a varios valores (1000, 100, 1), pero el tiempo de espera siempre ocurre después de aproximadamente 20 segundos. También intentamos usar el método .Ping() pero tenemos el mismo problema.

Pregunta: ¿cómo podemos manejar el escenario en el que el servidor Redis está caído y queremos cambiar a una búsqueda de base de datos más rápidamente?

Respuesta

0

No debe confiar en el servidor redis para decirle cuánto debe esperar la solicitud antes de pasar al plan B. Establezca esta lógica en el código que ejecuta la solicitud para que sea independiente de cómo se configura el servidor redis

1

Tuve un problema similar al enviar un correo electrónico: a veces no hay respuesta y el tiempo de espera incorporado (de SmtpClient) no hace nada. Eventualmente obtendría un tiempo de espera que creo que proviene de la capa subyacente de TCP/IP. Puse el tiempo de espera en el cliente un poco más corto que el "tiempo de espera brutal" en la tarea. Espera.

Mi solución fue para envolver la llamada en una tarea, y el uso de un tiempo de espera en la que:

 // 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)); 

Tal vez algo similar podría funcionar para usted, basta con sustituir el SendEmail con un método que hace lo Redis.

Cuestiones relacionadas