我的应用程序在Windows Web 5服务器的生产Web场中使用AppFabric来实现我们的分布式缓存模型。该应用程序是一个.net4 c#web应用程序。我们遇到了AppFabric的一些问题,并且有关于此类设置的一些问题。我们主要的问题是如果Web服务器5台的一个重新启动,在其他服务器上的网站也将下井的时间与AppFabric的例外一样出现在我们的事件日志以下短周期:解决应用程序问题时需要的帮助
- 消息:ErrorCode:SubStatus:存在临时故障。请稍后重试。
- ErrorCode:SubStatus:引用的区域不存在。使用CreateRegion API来修复错误。
我们有一个缓存提供者包装类,它创建datacachefactory对象等,并用作web应用程序和appfabric之间的中介。这是一个singleton类,因此在类的Init上只创建一个datacachefactory对象实例。
上面的第二个错误我相信我找到了原因,在我们的代码中,该区域是在Init上创建的,即在一开始时,但是如果一个节点从包含该区域的簇中出来,那么上面的错误就是结果。为了解决这个问题,应该尝试在每个请求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个辅助主机。
我从这里以下的一些问题是:
- 我看过有一个本地缓存 - 这个是什么技术优势?即。这会给每个节点的本地数据副本。
- 关于港口的最佳做法是什么?上述端口是否正确或可能与正在使用的端口有冲突?
- 3主角主持人和2副手,这是一个建议拆分?这是否意味着有3份数据?
当我们重新启动服务器时,我们试图不再同时重新启动主导主机。
感谢您对此的任何反馈!