Несколько DataCacheClients - странное поведение конфигурации

Я использую кэширование в роли Azure для нашего кластера веб-ролей.

Мне нужно использовать отдельный dataCacheClients чтобы иметь разные и явно заданные конфигурации транспортных свойств (maxBufferPoolSize а также maxBufferSize).

Проблема в том, что каждый dataCacheClient всегда устанавливается с тем же maxBufferPoolSize а также maxBufferSize ценности. Все они установлены на значения из dataCacheFactory который я создаю первым.

<dataCacheClients>
  <dataCacheClient name="DataCache1">
    <autoDiscover isEnabled="true" identifier="MyRoleName" />
    <transportProperties maxBufferPoolSize="6400000" maxBufferSize="256" />
  </dataCacheClient>
  <dataCacheClient name="DataCache2">
    <autoDiscover isEnabled="true" identifier="MyRoleName" />
    <transportProperties maxBufferPoolSize="0" maxBufferSize="10485760" />
  </dataCacheClient>
  <dataCacheClient name="DataCache3">
    <autoDiscover isEnabled="true" identifier="MyRoleName" />
    <transportProperties maxBufferPoolSize="3276800" maxBufferSize="32768" />
  </dataCacheClient>
</dataCacheClients>

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

Итак, здесь выдается исключение из-за того, что MaxBufferSize слишком мал на 256.

DataCacheException брошено

При отладке фабрики вы можете ясно видеть, что MaxBufferSize не 256:

MaxBufferSize отладка

Я начинаю выдергивать волосы, поэтому у меня возникли две идеи:

Я подозреваю, что StartPort а также DiscoveryPort в каждом клиенте данных AutoDiscoveryProperties одинаковы во всех (22233 как StartPort и 24233 как DiscoveryPort), что заставляет меня поверить, что они могут быть вытаскивать с одного и того же завода (и, следовательно, используя те же настройки)

В дополнение DataCacheServerEndpoint для каждого клиента тоже то же самое, в 2000 году. Возможно, они должны быть разными?

Я использую Microsoft.WindowsAzure.Caching 2.4.0.0 и Azure SDK 2.4.

Может ли кто-нибудь помочь направить меня в правильном направлении?

2 ответа

Кажется, ваша проблема не в клиентском сайте, а в серверной части. Убедитесь, что ваш maxBufferSize на вашем сервере имеет правильный размер, пример конфигурации msdn:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <!--configSections must be the FIRST element -->
<configSections>
   <!-- required to read the <dataCacheClient> element -->
   <section name="dataCacheClient"
         type="Microsoft.ApplicationServer.Caching.DataCacheClientSection,
            Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, 
            Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          allowLocation="true"
          allowDefinition="Everywhere"/>
</configSections>

   <dataCacheClient requestTimeout="15000" channelOpenTimeout="3000" maxConnectionsToServer="1">
      <localCache isEnabled="true" sync="TimeoutBased" ttlValue="300" objectCount="10000"/>
      <clientNotification pollInterval="300" maxQueueLength="10000"/>
      <hosts>
         <host name="CacheServer1" cachePort="22233"/>
         <host name="CacheServer2" cachePort="22233"/>
      </hosts>
      <securityProperties mode="Transport" protectionLevel="EncryptAndSign" />
      <transportProperties connectionBufferSize="131072" maxBufferPoolSize="268435456" 
                           maxBufferSize="8388608" maxOutputDelay="2" channelInitializationTimeout="60000" 
                           receiveTimeout="600000"/>
   </dataCacheClient>
</configuration>

Конфигурация хоста Azure

Попробуйте использовать следующий фрагмент:

        // DataCacheFactoryConfiguration encapsulates the datacache client section of the config. 
        DataCacheFactoryConfiguration dcfc1 = new DataCacheFactoryConfiguration("DataCache1");
        DataCacheFactory dcf1 = new DataCacheFactory(dcfc1);
        DataCache dc1 = dcf1.GetDefaultCache();

В качестве альтернативы вы можете настроить его программно:

        // This will create an instance of DataCacheFactoryConfiguration from default datacache client in config.
        DataCacheFactoryConfiguration dcfc = new DataCacheFactoryConfiguration();
        //You can then set the buffer size as you wish and create DataCacheFactory and DataCache after that.
        dcfc.TransportProperties.MaxBufferSize = size;
        DataCacheFactory dcf = new DataCacheFactory(dcfc);
        DataCache dc = dcf.GetDefaultCache();

Edit1: я создал два разных клиента, используя две разные фабрики, и я вижу, что у них разный максимальный размер буфера.

        DataCacheFactoryConfiguration dcfc = new DataCacheFactoryConfiguration();
        dcfc.TransportProperties.MaxBufferSize = 8388608;
        DataCacheFactory dcf = new DataCacheFactory(dcfc);
        DataCache dc = dcf.GetDefaultCache();

        DataCacheFactoryConfiguration dcfc1 = new DataCacheFactoryConfiguration();
        dcfc1.TransportProperties.MaxBufferSize = 8388;
        DataCacheFactory dcf1 = new DataCacheFactory(dcfc1);
        DataCache dc1 = dcf1.GetDefaultCache();
Другие вопросы по тегам