2014-09-25 18 views
11

Sto utilizzando Azure Redis Cache in uno scenario di carico elevato per una singola macchina che interroga la cache. Questa macchina ottiene e imposta circa 20 articoli al secondo. Durante il giorno questo aumenta, durante la notte questo è meno.Perché le connessioni ad Azure Redis Cache sono così elevate?

Finora, le cose hanno funzionato bene. Oggi mi sono reso conto che la metrica di "Connected Clients" è estremamente alta, anche se ho solo 1 cliente che ottiene e ottiene costantemente gli elementi. Ecco uno screenshot della metrica voglio dire: Redis Cache Connected Clients

Il mio codice è simile al seguente:

public class RedisCache<TValue> : ICache<TValue> 
{ 
    private IDatabase cache; 
    private ConnectionMultiplexer connectionMultiplexer; 

    public RedisCache() 
    { 
     ConfigurationOptions config = new ConfigurationOptions(); 
     config.EndPoints.Add(GlobalConfig.Instance.GetConfig("RedisCacheUrl")); 
     config.Password = GlobalConfig.Instance.GetConfig("RedisCachePassword"); 
     config.ConnectRetry = int.MaxValue; // retry connection if broken 
     config.KeepAlive = 60; // keep connection alive (ping every minute) 
     config.Ssl = true; 
     config.SyncTimeout = 8000; // 8 seconds timeout for each get/set/remove operation 
     config.ConnectTimeout = 20000; // 20 seconds to connect to the cache 

     connectionMultiplexer = ConnectionMultiplexer.Connect(config); 
     cache = connectionMultiplexer.GetDatabase(); 
    } 

    public virtual bool Add(string key, TValue item) 
    { 
     return cache.StringSet(key, RawSerializationHelper.Serialize(item)); 
    } 

io non sto creando più di un'istanza di questa classe, quindi questo non è il problema. Forse non conosco la metrica delle connessioni e quello che vogliono dire è il numero di volte in cui accedo al cache, tuttavia, a mio avviso, non avrebbe molto senso. Qualche idea o qualcuno con un problema simile?

risposta

14

StackExchange.Redis ha avuto una condizione di competizione che potrebbe portare a connessioni trapelate in alcune condizioni. Questo problema è stato risolto nella versione 1.0.333 o successiva.

Se si desidera confermare questo è il problema che si sta verificando, ottenere un crash dump dell'applicazione client e guardare gli oggetti sull'heap in un debugger. Cerca un numero elevato di oggetti StackExchange.Redis.ServerEndPoint.

Inoltre, diversi utenti hanno riscontrato un bug nel codice che ha provocato la perdita di oggetti di connessione. Questo è spesso perché il loro codice sta tentando di ricreare l'oggetto ConnectionMultiplexer se vedono guasti o stato disconnesso. Non c'è davvero bisogno di ricreare ConnectionMultiplexer in quanto ha una logica interna per ricreare la connessione, se necessario. Assicurati di impostare abortConnect su false nella stringa di connessione.

Se si decide di ricreare l'oggetto di connessione, assicurarsi di disporre del vecchio oggetto prima di rilasciare tutti i riferimenti ad esso.

Quello che segue è il modello che stiamo raccomandando:


     private static Lazy lazyConnection = new Lazy(() => { 
      return ConnectionMultiplexer.Connect("contoso5.redis.cache.windows.net,abortConnect=false,ssl=true,password=..."); 
     }); 

     public static ConnectionMultiplexer Connection { 
      get { 
       return lazyConnection.Value; 
      } 
     } 
+1

Grazie JonCole, questo è stato il problema. Un aggiornamento a 1.0.333 risolve il problema. – Christian

Problemi correlati