我正在为我们的Web角色群使用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
也是相同的,在20004.也许他们需要不同?
我正在使用Microsoft.WindowsAzure.Caching 2.4.0.0和Azure SDK 2.4。
任何人都可以帮我指出正确的方向吗?
答案 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>
答案 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();