Несколько 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.
При отладке фабрики вы можете ясно видеть, что MaxBufferSize не 256:
Я начинаю выдергивать волосы, поэтому у меня возникли две идеи:
Я подозреваю, что 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>
Попробуйте использовать следующий фрагмент:
// 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();