【问题标题】:assistance required in solving appfabric issues解决 appfabric 问题所需的帮助
【发布时间】:2012-02-11 11:25:01
【问题描述】:

我的应用程序在 Windows Web 5 服务器的生产 Web 场中将 AppFabric 用于我们的分布式缓存模型。该应用程序是一个 .net4 c# Web 应用程序。我们在使用 AppFabric 时遇到了一些问题,并且对此类设置有一些疑问。我们遇到的主要问题是,如果重新启动 web 5 服务器中的一个,其他服务器上的站点也会在短时间内关闭,并且我们的事件日志中会出现如下 appfabric 异常:

  • 消息:错误代码:子状态:暂时失败。请稍后重试。
  • 错误代码:子状态:引用的区域不存在。使用 CreateRegion API 修复错误。

我们有一个缓存提供程序包装类,它创建 datacachefactory 对象等,并用作 Web 应用程序和 appfabric 之间的中介。这是一个单例类,因此在该类的 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 个辅助主机。

我对此的一些问题是:

  • 我已经阅读了有关拥有本地缓存​​的信息 - 这有什么技术优势? IE。这是否会为每个节点提供数据的本地副本。
  • 关于端口的最佳做法是什么?上述端口是否正确,或者是否会与使用的相同端口发生冲突?
  • 3 个主要主机和 2 个辅助主机,这是推荐的拆分吗?这是否意味着数据有 3 个副本?

当我们重新启动服务器时,我们会尝试从不同时重新启动主要主机。

感谢您对此的任何反馈!

【问题讨论】:

    标签: c# .net appfabric distributed-caching azure-appfabric


    【解决方案1】:

    我们广泛使用 AppFabric 缓存。你会看到

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

    相当频繁。最好为自己编写一个围绕 AppFabric 的包装器,以便在引发此错误时自动重试。您确实想使用指数退避,但如果不随机化重试周期可能就足够了。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多