我的应用程序在Windows Web 5服务器的生产Web场中使用AppFabric作为我们的分布式缓存模型。该应用程序是一个.net4 c#Web应用程序。我们遇到了AppFabric的一些问题,并对此类设置有一些疑问。我们遇到的主要问题是,如果重新启动其中一个Web服务器,其他服务器上的站点也将在一小段时间内出现故障,其中包括以下事件日志中出现的appfabric异常:
我们有一个缓存提供程序包装类,它创建datacachefactory对象等,并用作Web应用程序和appfabric之间的中介。这是一个单例类,因此在类的Init上只创建了一个datacachefactory对象的实例。
上面的第二个错误我相信我已经找到了原因,在我们的代码中,区域是在Init上创建的,即在一开始,但是如果一个节点来自包含其memorary中的区域的集群,那么上面的错误就是结果。要解决此问题,应尝试在每个请求appfabric上创建该区域 - 但仅在不存在的情况下创建它 - 这听起来是否正确?
关于其他错误,我相信它可能归结为配置。这是集群配置xml文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="dataCache" type="Microsoft.ApplicationServer.Caching.DataCacheSection, Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<dataCache size="Small">
<caches>
<cache consistency="StrongConsistency" name="App1Cache"
secondaries="1">
<policy>
<eviction type="Lru" />
<expiration defaultTTL="10" isExpirable="true" />
</policy>
</cache>
<cache consistency="StrongConsistency" name="App2Cache"
secondaries="1">
<policy>
<eviction type="Lru" />
<expiration defaultTTL="10" isExpirable="true" />
</policy>
</cache>
<cache consistency="StrongConsistency" name="App3Cache"
secondaries="1">
<policy>
<eviction type="Lru" />
<expiration defaultTTL="10" isExpirable="true" />
</policy>
</cache>
<cache consistency="StrongConsistency" name="default">
<policy>
<eviction type="Lru" />
<expiration defaultTTL="10" isExpirable="true" />
</policy>
</cache>
</caches>
<hosts>
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="724664608" size="1228" leadHost="true" account="SERVER1\user"
cacheHostName="AppFabricCachingService" name="SERVER1"
cachePort="22233" />
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="598646137" size="1228" leadHost="true" account="SERVER2\user"
cacheHostName="AppFabricCachingService" name="SERVER2"
cachePort="22233" />
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="358039700" size="1228" leadHost="true" account="SERVER3\user"
cacheHostName="AppFabricCachingService" name="SERVER3"
cachePort="22233" />
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="929915039" size="1228" leadHost="false" account="SERVER4\user"
cacheHostName="AppFabricCachingService" name="SERVER4"
cachePort="22233" />
<host replicationPort="22236" arbitrationPort="22235" clusterPort="22234"
hostId="1752630351" size="1228" leadHost="false" account="SERVER5\user"
cacheHostName="AppFabricCachingService" name="SERVER5"
cachePort="22233" />
</hosts>
<advancedProperties>
<securityProperties>
<authorization>
<allow users="everyone" />
</authorization>
</securityProperties>
</advancedProperties>
</dataCache>
</configuration>
注意:我们设置了多个缓存,因为我们使用appfabric有多个应用程序,并且看到它们都存在相同的问题。
这是每台服务器上应用程序中的web.config条目:
<dataCacheClient requestTimeout="15000" channelOpenTimeout="3000" maxConnectionsToServer="1">
<localCache isEnabled="true" sync="TimeoutBased" ttlValue="300" objectCount="10000" />
<clientNotification pollInterval="300" maxQueueLength="10000" />
<hosts>
<host name="SERVER1" cachePort="22233" />
<host name="SERVER2" cachePort="22233" />
<host name="SERVER3" cachePort="22233" />
<host name="SERVER4" cachePort="22233" />
<host name="SERVER5" cachePort="22233" />
</hosts>
<transportProperties connectionBufferSize="131072" maxBufferPoolSize="268435456" maxBufferSize="8388608" maxOutputDelay="2" channelInitializationTimeout="60000" receiveTimeout="600000" /></dataCacheClient>
有人看到上述问题吗?如您所见,我们有3个主要主持人和2个副主持人。
我从中得到的一些问题是:
当我们重新启动服务器时,我们会尝试永远不会同时重启主机主机。
感谢您对此提出任何反馈意见!
答案 0 :(得分:1)
我们广泛使用AppFabric缓存。你会看到
Message: ErrorCode:SubStatus:There is a temporary failure. Please retry later.
经常。最好自己编写一个AppFabric包装器,它可以在抛出此错误时自动重试。你真的想使用指数退避,但是没有随机化重试周期可能就足够了。
Web.config文件中的缓存配置仅用于创建缓存工厂。它将联系其中一个主机并从中获取群集配置。列出Web.config中所有主机的唯一好处是,如果主机关闭,它可以联系其他主机。即使您只列出了一个主机,只要该主机存在,您的缓存就可以正常工作。
如果您比写入对象更频繁地读取对象,则使用本地缓存可能会提高性能。你将不得不通过实验来调整它的大小。