Инициализация AppFabric DataCacheFactory часто занимает ~ 30 секунд - PullRequest
1 голос
/ 26 ноября 2010

Когда я инициализирую мой клиент для подключения к кешу AppFabric, кажется, что для соединения по следующей строке непоследовательно требуется до 30 секунд:

factory = new DataCacheFactory(configuration); 

См. Полный код Init () ниже - в основном взято из здесь . Я говорю непоследовательно, потому что иногда это занимает 1 секунду, а иногда 27, 28 и т. Д. ... секунд. У меня есть сайт asp.net, использующий кэш AppFabric, который находится в другом окне (в том же домене). Все работает отлично, за исключением непоследовательного времени соединения. Когда он подключается, все хорошо - мне просто нужно, чтобы он постоянно подключался через ~ 1 секунду :) ... Мысли?

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 ...
            }
        }
    }

1 Ответ

0 голосов
/ 08 декабря 2010

Является ли это быстрее и / или более последовательным, если вы храните всю информацию о конфигурации в файле .config, а не создаете свою конфигурацию программно? См. здесь для получения подробной информации - я бы всегда использовал этот метод, в отличие от программной конфигурации, так как его намного легче обновлять, когда что-то меняется.

В противном случае я думаю, что общий совет заключается в том, что DataCacheFactory - это дорогостоящий объект, создаваемый из-за того, что он делает, то есть устанавливает сетевое соединение с каждым сервером в кластере. Вы определенно не хотите создавать DataCacheFactory каждый раз, когда вам нужно получить что-то из кэша, вместо этого вы можете подумать о том, чтобы создать его в Application_Start как, возможно, единичный объект, а затем повторно использовать его во всем приложении ( само собой разумеющееся, не решает проблему, но может помочь ее решить).

...