2010-11-26 21 views
1

Quand j'initialiser mon client de se connecter au cache AppFabric, il semble prendre de manière incompatible jusqu'à 30 secondes pour se connecter sur la ligne suivante:initialisation AppFabric DataCacheFactory prend souvent ~ 30 secondes

factory = new DataCacheFactory(configuration); 

Voir toute Init() code ci-dessous - principalement tiré de here. Je dis de façon incohérente parce que parfois cela prend 1 seconde et d'autres fois 27, 28, etc ... secondes. J'ai un site asp.net utilisant le cache AppFabric - qui vit dans une boîte différente (sur le même domaine). Tout fonctionne très bien, sauf pour le temps de connexion incohérent. Quand il se connecte, tout est bon - j'ai juste besoin de le connecter régulièrement en ~ 1 seconde :) ... Pensées?

public static void Init() 
    { 
     if (cache == null) 
     { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      try 
      { 
       //Define Array for 1 Cache Host 
       List<DataCacheServerEndpoint> servers = new List<DataCacheServerEndpoint>(1); 

       var appFabricHost = ConfigurationManager.AppSettings["AppFabricHost"]; 
       var appFabricPort = ConfigurationManager.AppSettings["AppFabricPort"].ParseAs<int>(); 

       //Specify Cache Host Details 
       // Parameter 1 = host name 
       // Parameter 2 = cache port number 
       servers.Add(new DataCacheServerEndpoint(appFabricHost, appFabricPort)); 
       TraceHelper.TraceVerbose("Init", string.Format("Defined AppFabric - Host: {0}, Port: {1}", appFabricHost, appFabricPort)); 

       //Create cache configuration 
       DataCacheFactoryConfiguration configuration = new DataCacheFactoryConfiguration(); 

       //Set the cache host(s) 
       configuration.Servers = servers; 

       //Set default properties for local cache (local cache disabled) 
       configuration.LocalCacheProperties = new DataCacheLocalCacheProperties(); 

       //Disable tracing to avoid informational/verbose messages on the web page 
       DataCacheClientLogManager.ChangeLogLevel(System.Diagnostics.TraceLevel.Off); 

       //Pass configuration settings to cacheFactory constructor 
       factory = new DataCacheFactory(configuration); 

       //Get reference to named cache 
       cache = factory.GetCache(cacheName); 
       TraceHelper.TraceVerbose("Init", "Defined AppFabric - CacheName: " + cacheName); 
      } 
      catch (Exception ex) 
      { 
       TraceHelper.TraceError("Init", ex); 
      } 
      finally 
      { 
       TraceHelper.TraceInfo("Init", string.Format("AppFabric init took {0} seconds", sw.Elapsed.Seconds)); 
      } 

      if (cache == null) 
      { 
       TraceHelper.TraceError("Init", string.Format("First init cycle took {0} seconds and failed, retrying", sw.Elapsed.Seconds)); 
       UrlShortener.Init(); // if at first you don't succeed, try try again ... 
      } 
     } 
    } 
+0

Je suis heureux de fournir plus d'informations si ce serait utile? – downatone

Répondre

0

est-il plus rapide et/ou plus cohérente si vous gardez toutes les informations de configuration dans un fichier .config plutôt que de créer votre configuration programme? Voir here pour les détails - J'utiliserais toujours cette méthode par opposition à la configuration programmatique car il est beaucoup plus facile de la mettre à jour quand quelque chose change.

Sinon, je pense que le conseil général est que DataCacheFactoryest un objet coûteux à créer en raison de ce qu'il fait dire fait une connexion réseau à chaque serveur du cluster. Vous ne voulez certainement pas créer DataCacheFactory chaque fois que vous avez besoin de quelque chose du cache, vous devriez plutôt penser à le créer en Application_Start comme un singleton, puis en réutilisant celui-ci dans votre application (ce qui, accordé, résoudre le problème mais il pourrait servir à l'atténuer).

+0

Merci pour la réponse - n'ont pas été en mesure de déplacer cela à prod jusqu'à ce que je l'ai résolu. J'appelle déjà l'Init() sur Application_Start et réutilise donc c'est un singleton. Une fois Init() terminé, je n'ai aucun problème, c'est juste ce potentiel initial ~ 30 secondes qui est le kicker (voir ici: http://stackoverflow.com/questions/4338340/overlapped-recycle-and-application-start). Je vais déplacer la configuration AppFabric dans le web.config comme suggéré et vous permettra de savoir si cela résout le problème. à votre santé. – downatone

+0

Salut Phil - donc je l'ai dans le web.config maintenant et je vois le même problème. Je l'ai même vu prendre jusqu'à 4 minutes pour se connecter. Je devine le factory.GetCache (xyz) a un timeout intégré, donc mon code se rétracte jusqu'à ce qu'il réussisse. D'autres pensées, c'est une performance lamentable. – downatone