2012-03-20 16 views
6

Stiamo implementando un modello in cui il nostro client controlla se esiste un documento in Redis e, in caso contrario, recuperiamo i dati dal database.Come implementare ServiceStack Redis Client con timeout

Stiamo cercando di gestire un caso in cui il server Redis è inattivo o irraggiungibile, in modo da poter prelevare immediatamente dal database.

Tuttavia, quando testiamo il nostro codice eliminando intenzionalmente il server Redis, la chiamata a Redis tramite il client ServiceStack non viene interrotta per circa 20 secondi.

Abbiamo provato a utilizzare la proprietà RedisClient .SendTimeout su vari valori (1000, 100, 1), ma il timeout si verifica sempre dopo circa 20 secondi. Abbiamo anche provato a utilizzare il metodo .Ping() ma abbiamo lo stesso problema.

Domanda: come possiamo gestire lo scenario in cui il server Redis è inattivo e vogliamo passare a un recupero del database più rapidamente?

risposta

0

Non si deve fare affidamento sul server redis per indicare per quanto tempo la richiesta deve attendere prima di eseguire il flipping per pianificare B. Inserire questa logica nel codice che esegue la richiesta in modo che sia indipendente da come è impostato il server redis

1

Ho avuto un problema simile all'invio di e-mail: a volte non c'è risposta e il timeout incorporato (di SmtpClient) non fa nulla. Alla fine ottengo un timeout che credo provenga dal livello TCP/IP sottostante. Avrei impostato il timeout nel client un po 'più breve del "timeout brutale" su Task.Wait.

La mia soluzione era quella di avvolgere la chiamata in un task, e utilizzare un timeout che:

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

Forse qualcosa di simile avrebbe funzionato per voi, basta sostituire il SendEmail con un metodo che fa la cosa Redis.

Problemi correlati