多个DataCacheClients - 奇怪的配置行为

时间:2014-10-16 20:56:46

标签: wcf azure azure-caching appfabric-cache azure-in-role-cache

我正在为我们的Web角色群使用Azure的角色内缓存。

我需要使用单独的dataCacheClients,以便具有不同的显式设置传输属性配置(maxBufferPoolSizemaxBufferSize)。

问题是每个dataCacheClient始终设置为相同的maxBufferPoolSizemaxBufferSize值。它们都设置为我首先实例化的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 thrown

调试工厂时,您可以清楚地看到MaxBufferSize不是256:

MaxBufferSize debugging

我开始拔头发了,所以我想出了两个想法:

我怀疑每个数据客户端StartPort中的DiscoveryPortAutoDiscoveryProperties在所有数据客户端中都是相同的(22233为StartPort,24233为DiscoveryPort ),这让我相信他们可能会从同一家工厂拉出来(因此使用相同的设置)。

此外,每个客户的DataCacheServerEndpoint也是相同的,在20004.也许他们需要不同?

我正在使用Microsoft.WindowsAzure.Caching 2.4.0.0和Azure SDK 2.4。

任何人都可以帮我指出正确的方向吗?

2 个答案:

答案 0 :(得分:0)

看来你的问题不是客户端站点,而是服务器端。确保服务器上的maxBufferSize大小合适sample configuration 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 host configuration

答案 1 :(得分:-1)

尝试使用以下代码段:

        // 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();