【问题标题】:AppFabric caching's local cache isnt working for us... What are we doing wrong?AppFabric 缓存本地缓存对我们不起作用......我们做错了什么?
【发布时间】:2011-06-06 16:36:39
【问题描述】:

我们使用 appfabric 作为 NHibernate asp.net 应用程序的二级缓存,该应用程序包括面向客户的网站和管理网站。它们都连接到同一个缓存,因此当管理员更新某些内容时,面向客户的站点也会更新。

似乎工作正常 - 我们在单独的服务器上有一个 CacheCLuster,一切都很好,但我们希望启用 localcache 以获得更好的性能,但是它似乎没有工作。

我们是这样启用的...

  bool UseLocalCache = 
  int LocalCacheObjectCount = int.MaxValue;
  TimeSpan LocalCacheDefaultTimeout = TimeSpan.FromMinutes(3);
  DataCacheLocalCacheInvalidationPolicy LocalCacheInvalidationPolicy = DataCacheLocalCacheInvalidationPolicy.TimeoutBased;

        if (UseLocalCache)
        {
            configuration.LocalCacheProperties =
                new DataCacheLocalCacheProperties(
                    LocalCacheObjectCount,
                    LocalCacheDefaultTimeout,
                    LocalCacheInvalidationPolicy
                    );

          //  configuration.NotificationProperties =  new DataCacheNotificationProperties(500, TimeSpan.FromSeconds(300));
        }

最初我们尝试使用超时失效策略(3 分钟),我们的应用感觉运行得更快了。但是,我们注意到,如果我们在管理站点中更改某些内容,它会立即在实时站点中更新。由于我们使用的是超时而不是通知,这表明本地缓存没有被查询(或者是,但总是丢失)。

cache.GetType().Name 返回“LocalCache”——所以工厂已经做了本地缓存。

在我的开发环境中的 PS 中运行“Get-Cache-Statistics MyCache”(从 vs2008 本地运行的 asp.net 应用程序,在单独的 w2k8 机器上运行的缓存集群)显示了一些请求计数。但是,在生产环境中,请求计数会急剧增加。

我们尝试按照此处的方法来设置缓存客户端服务器流量...http://blogs.msdn.com/b/appfabriccat/archive/2010/09/20/appfabric-cache-peeking-into-client-amp-server-wcf-communication.aspx 但日志文件中只有初始标头 - 即也没有登录。

我在 SO 或 Google 中找不到任何东西。

我们做错了吗?我们有没有搞砸 AppFabric 的安装——我们是通过 WebPlatform Installer 安装的——我想? (注意:运行 ASp.net 的 IIS 框不在集群中 - 它只是客户端)。

任何见解都非常受欢迎!

【问题讨论】:

    标签: nhibernate caching appfabric second-level-cache


    【解决方案1】:

    您是否尝试过使用休眠分析器? http://nhprof.com/

    还有这个: http://mdcadmintool.codeplex.com/

    这是管理和查看缓存的好方法。

    这两种方法都可能有助于调试问题。

    【讨论】:

    • 对不起,我应该说,是的,我们使用了 NH prof 并且 NHProf 说一切都是缓存命中 - 但我们遇到的问题是它似乎正在命中缓存集群而不是本地缓存。 mdcaadmintool 也没有帮助我们,因为它只会告诉我们缓存集群中发生的事情——而不是本地缓存,本地缓存将是我们的 asp.net w3wp.exe 的 InProc。感谢您的想法。
    【解决方案2】:

    您使用哪些DataCache 方法从缓存中读取?无论是否配置了本地缓存,一些DataCache 方法总是会对服务器产生影响。如果您想利用本地缓存,您几乎必须确保只使用Get

    这是我对 AppFabric 缓存最大的缺点之一。他们没有向你解释任何这些,所以当你开始依赖本地缓存时,你开始陷入这些小陷阱,因为你不认为你会因为与服务交谈、通过网络传输数据而付出代价和反序列化对象,但你是。

    最糟糕的是,我可以理解必须与服务交谈以确保本地缓存代表最新数据。我什至可以理解将数据传回,这样就不会进行多次调用。但我终生无法理解的是,即使本地缓存中的实例被验证仍然是从缓存返回的当前版本,它们仍然反序列化来自线而不是仅仅返回已经在内存中的实例。如果您的对象很大/很复杂,这可能会造成很大的伤害。

    【讨论】:

      【解决方案3】:

      经过几天又几天的调查,为什么我们会收到如此多的本地缓存未命中,我们终于解决了这个问题:

      1. AppFabric v 1.1 中的本地缓存存在一个错误,该错误已在 CU4 中修复,请参阅http://support2.microsoft.com/kb/2800726/en-us
      2. 确保您的应用程序使用的 Microsoft.ApplicationServer.Caching.Client.dll 也已更新。我们在机器上安装了 CU4,但从我们应用程序的 NuGet 包中获得了没有 CU4 的 Client.dll。在我们的例子中,一个简单的 NuGet 包更新让一切正常。

      在安装 CU4 并确保 Client.dll 也已更新后,由于本地缓存命中增加,我们对 AppFabric 主机的读取减少了很多。耶!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        相关资源
        最近更新 更多