2012-02-11 94 views
1

我的应用程序在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份数据?

当我们重新启动服务器时,我们试图不再同时重新启动主导主机。

感谢您对此的任何反馈!

回答

1

我们广泛使用AppFabric缓存。您将经常看到

Message: ErrorCode:SubStatus:There is a temporary failure. Please retry later. 

。最好是自己写一个AppFabric的包装器,当出现这个错误时自动重试。你真的想要使用指数回退,但是如果没有使重试周期随机化就足够了。

Web.config文件中的缓存配置仅用于创建缓存工厂。它将联系其中一台主机并从中获取集群配置。在Web.config中列出所有主机的唯一好处是,如果主机关闭,它可以联系另一个主机。即使您只列出了一台主机,但前提是您的缓存工作正常。

如果您比对象更频繁地读取对象,则使用本地缓存可能会提高性能。你将不得不通过实验来调整它的大小。