2012-06-12 20 views
6

Ho recentemente iniziato a ospitare un mio progetto parallelo sulle nuove macchine virtuali di Azure. L'app utilizza Redis come cache in memoria. Tutto stava funzionando bene nel mio ambiente locale ma ora che ho spostato il codice in Azure vedo alcune strane eccezioni che escono da Booksleeve.Errori di connessione redis quando si utilizza il client Booksleeve Redis in Azure VM

Quando l'app si accende per la prima volta, tutto funziona correttamente. Tuttavia, dopo circa 5-10 minuti di inattività, la prossima richiesta all'app presenta un'eccezione di rete (sono al lavoro in questo momento e non ho i messaggi di errore esatti su di me, quindi li posterò quando torno a casa se la gente pensa di essere pertinente alla discussione) Questo fa sì che il MessageQueue interno si chiuda, il che si traduce in ogni successivo Enqueue() che genera un'eccezione ("La coda è chiusa").

Quindi dopo un po 'di ricerca su google ho trovato questo post SO: Maintaining an open Redis connection using BookSleeve su un gestore di connessione DIY. Posso certamente implementare qualcosa di simile se quella è la migliore linea d'azione.

Quindi, domande:

  1. è normale per il RedisConnection per chiudere periodicamente dopo un certo periodo di tempo?
  2. Ho visto il metodo conn.SetKeepAlive() ma ho provato molti valori diversi e nessuno sembra fare la differenza. C'è dell'altro o sto abbaiando dall'albero sbagliato?
  3. L'idea del gestore connessioni dal post è il modo migliore per gestire questo scenario?
  4. Qualcuno può far luce su perché ospitare l'istanza di Redis in una nuova VM di Azure causa questo problema? Posso anche confermare che se eseguo il mio ambiente locale contro la VM di Azure Redis, ho riscontrato questo problema.

Come ho già detto, se è insolito che una connessione Redis muoia dopo l'inattività, invierò le tracce dello stack e le eccezioni dai miei registri quando torno a casa.

Grazie!

UPDATE Didier ha sottolineato nei commenti che questo può essere correlato al balanacer carico che Azure utilizza: http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details.aspx

Partendo dal presupposto che è il caso, quale sarebbe il modo migliore per attuare una gestione connessione che potrebbe conto di questo problema sciocco. Presumo che non dovrei creare una connessione per unità di lavoro, giusto?

+0

Cosa si ha nel parametro di timeout del file di configurazione Redis? Questo è il timeout di inattività (impostarlo su 0 per evitare che Redis chiuda le connessioni inattive). –

+0

Il timeout è impostato su 0 già. Appena ricontrollato pure. :( – Eric

+1

Sembra essere una "funzione" di AzureVM ... Vedi http://blogs.msdn.com/b/avkashchauhan/archive/2011/11/12/windows-azure-load-balancer-timeout-details .aspx –

risposta

6

Da altre risposte/commenti, sembra che questo sia causato dall'infrastruttura azzerata che interrompe i socket che sembrano inattivi. potrebbe semplicemente avere un timer da qualche parte che esegue periodicamente un qualche tipo di operazione, ma si noti che questo è già incorporato in Booksleeve: quando si connette controlla quale è il timeout della connessione redis e configura un heartbeat per impedire ai redis di chiudere il zoccolo. Potresti essere in grado di portarlo a termine per evitare che azzuri anche il socket.Per esempio, in una sessione di Redis-cli:

config set timeout 30 

dovrebbe configurare Redis (al volo, senza dover riavviare) per avere un secondo timeout di 30 di collegamento. Booksleeve dovrebbe quindi adottare automaticamente le misure necessarie per garantire che vi sia un battito cardiaco poco prima di 30 secondi. Notare che se questo è successo, si dovrebbe anche modificare il file di configurazione in modo che questa impostazione si applichi anche dopo il riavvio successivo.

+0

Vale la pena sottolineare che è necessario impostare effettivamente un timeout> 0 per consentire a Booksleeve di eseguire automaticamente ping() quando viene impostato conn.SetKeepAlive (true). Quindi su Azure, è necessario impostare il timeout su 30 secondi come sopra e anche conn.SetKeepAlive (true). Senza un set di timeout di configurazione, Booksleeve non esegue controlli ping (anche con keepalive = true, un controllo interno all'interno di Booksleeve salta i ping quando non è impostato alcun timeout). Ciò significa che Azure arresta il socket a causa dell'inattività. – Andrew

+0

StackExchange.Redis ha lo stesso comportamento di battito cardiaco se è presente un timeout nella configurazione redis? – slypete

+1

@slypete sì, ma ha anche un battito cardiaco predefinito se non è presente un timeout –

1

Il Load Balancer in Windows Azure chiuderà la connessione dopo che X quantità di tempo dipenderà dal carico di connessione totale sul servizio di bilanciamento del carico e per questo si otterrà un timeout casuale nella connessione.

Poiché non sono ben noto alle connessioni di Redis, non sono in grado di suggerire come implementarlo correttamente, tuttavia in generale la soluzione suggerita è avere un battito cardiaco per mantenere viva la sessione. Hai la possibilità di cercare la soluzione suggerita nel blog e provare a implementare in Redis, se questo funziona per te?

+0

Grazie Avkash. In realtà stavo per provare a utilizzare una rete virtuale nella nuova anteprima di Azure, ma sfortunatamente non sono autorizzato a creare una VM da un'immagine personalizzata e ad aggiungerla a un gruppo Affinity. Apparentemente è permesso solo dalla schermata Quick Create? Ho inviato un post sul forum anche al forum della rete virtuale. – Eric

+0

Ciao Eric, ho visto il tuo post e sarò in grado di aiutarti nel problema di creazione di VM, ma c'è qualche problema con il forum MSDN quindi non posso non contattarti. Una volta risolto, ti contatterò per vedere cosa si può fare .. grazie .. – AvkashChauhan

+0

Credo di sapere cosa sta succedendo. Apparentemente l'immagine che ho creato è disponibile solo nel luogo in cui ha iniziato la vita (che era negli Stati Uniti occidentali) - Ho creato il vlan dopo l'immagine, e ora sembra che non sia possibile spostare l'immagine da una posizione all'altra. Hai idea se la creazione di un vlan sarà notevolmente migliore dal punto di vista delle prestazioni? Voglio dire, non è troppo oneroso solo creare un battito cardiaco nella mia app se necessario. – Eric

Problemi correlati