AppFabric缓存 - 正确使用DataCacheFactory和DataCache

时间:2010-09-24 05:00:21

标签: performance caching appfabric

我正在寻找最有效的方法来安排appFabric缓存调用使用datacache和datacache工厂,每页加载400到700个缓存(几乎没有任何放置)。似乎可以使用单个静态DataCacheFactory(或者可能是循环设置中的一对)。

我是否为每个DataCache对象请求调用GetCache(“cacheName”),还是在DataCache工厂初始化时将其设置为静态并将其用于所有调用?

我是否必须处理异常,检查失败代码并尝试重试?

当多个线程尝试使用缓存存储并且想要相同的项目(按键)时,是否必须考虑争用?

是否有某种文档可以正确地探讨其设计和使用?


我迄今为止从论坛收集的一些信息:

http://social.msdn.microsoft.com/Forums/en-AU/velocity/thread/98d4f00d-3a1b-4d7c-88ba-384d3d5da915

“创建工厂涉及连接到集群并且可能需要一些时间。但是一旦你拥有了工厂对象和你想要使用的缓存,你可以简单地重用这些对象来做put并进入缓存,你应该看到更快的表现。“

http://social.msdn.microsoft.com/Forums/en-US/velocity/thread/0c1d7ce2-4c1b-4c63-b525-5d8f98bb8a49

“创建单个DataCacheFactory(singleton)比创建多个DataCacheFactory更有效。你不应该为每个调用创建DataCacheFactory,它会有性能损失。”

“请尝试在您的单例中封装循环算法(具有3/4/5工厂实例)并比较负载测试结果。”

http://blogs.msdn.com/b/velocity/archive/2009/04/15/pushing-client-performance.aspx

“您可以增加客户端数量以增加缓存吞吐量。但有时如果您希望拥有较小的客户端集并增加吞吐量,则需要使用多个DataCacheFactory实例.DataCacheFactory实例创建与服务器的连接(例如,如果有3个服务器,它将创建3个连接)并将来自数据缓存的所有请求多路复用到这些连接。因此,如果put / get卷非常高,这些TCP连接可能会出现瓶颈。所以单向是创建多个DataCacheFactory实例,然后对它们使用操作。“


到目前为止正在使用的内容...调用该属性,如果返回值不为null,则执行操作。

private static DataCache Cache
{
    get
    {
        if (_cacheFactory == null)
        {
            lock (Sync)
            {
                if (_cacheFactory == null)
                {
                    try
                    {
                        _cacheFactory = new DataCacheFactory();
                    }
                    catch (DataCacheException ex)
                    {
                        if (_logger != null)
                        {
                            _logger.LogError(ex.Message, ex);
                        }
                    }
                }
            }
        }

        DataCache cache = null;

        if (_cacheFactory != null)
        {
            cache = _cacheFactory.GetCache(_cacheName);
        }

        return cache;
    }
}

在Microsoft AppFabric论坛上查看此问题:http://social.msdn.microsoft.com/Forums/en-AU/velocity/thread/e0a0c6fb-df4e-499f-a023-ba16afb6614f

2 个答案:

答案 0 :(得分:15)

以下是论坛帖子的答案:

  

您好。回复较晚,抱歉,   但我想说这些都很棒   问题,可能会有用   对其他人。

     

不应该需要更多   每个线程比一个DataCacheFactory   除非你要求不同   配置。例如,如果你   以编程方式配置   DataCacheFactory用   DataCacheFactoryConfiguration类,   那么你可能想创建一个   已启用本地缓存和另一个   那没有。在这种情况下,你会的   使用不同的DataCacheFactory对象   取决于您的配置   需要您的方案。但其他   比你配置上的差异   不应该看到性能提升   创建多个DataCacheFactories。

     

在同一主题上,有一个   MaxConnectionsToServer设置(或者   程序化的   DataCacheFactoryConfiguration或   应用程序配置文件为   dataCacheClient的一个属性   元件)。这决定了号码   每个DataCacheFactory的chennels   被打开到缓存集群。如果   您有高吞吐量的要求   还有可用的CPU /网络   带宽,将此设置增加到   3或更高可以增加吞吐量。   我们不建议增加此值   没有原因或价值   太高了你的需求。你应该   改变价值,然后测试你的   方案来观察结果。我们   希望有更多的官方指导   这将来。

     

一旦拥有了DataCacheFactory,就可以了   不需要调用GetCache()   多次获得多次   DataCache对象。每次打电话   GetCache()用于相同的缓存   同一工厂返回相同   DataCache对象。还有,一旦你有   您不需要DataCache对象   继续调用DataCacheFactory   为了它。只需存储DataCache   对象并继续使用它。   但是,不要让   DataCacheFactory对象被释放。   DataCache对象的生命周期是   绑定到DataCacheFactory对象。

     

你永远不必担心   与Get请求的争用。然而,   使用Put / Add请求,可以   争用多个数据缓存   客户端正在更新相同的密钥   同一时间。在这种情况下,你会   得到一个错误代码为的异常   ERRCA0017,RetryLater和子状态   ES0005,KeyLatched。但是,你   可以轻松添加异常处理和   重试逻辑以尝试更新   当这些错误发生时再次出现。   这可以用于RetryLater代码   具有各种子状态值。对于   更多信息,请参阅   http://msdn.microsoft.com/en-us/library/ff637738.aspx。   您也可以使用悲观锁定   通过使用GetAndLock()和   PutAndUnlock()API。如果你使用这个   方法是你的责任   确保所有缓存客户端都使用   悲观锁定。 Put()调用会   擦除以前的对象   由GetAndLock()锁定。

     

我希望这会有所帮助。就像我说的,我们   希望得到这种指导   一些正式的内容很快。但它是   最好在论坛上分享   直到那时。谢谢!

     杰森罗斯

答案 1 :(得分:4)

  

我是否为其调用了GetCache(“cacheName”)   每个DataCache对象请求,或者做   我当时制作一个静态   DataCache工厂已初始化   用于所有通话?

我想答案应该是真的;尝试两种方式,看看是否存在差异,但对于每次调用Get,我认为一个静态DataCache比对GetCache的相应调用更有意义。

“推送客户端性能”文章表明,有一个最佳位置,DataCacheFactory实例的数量可以获得最大性能,超过这个性能,内存开销就会对您起作用 - 很遗憾他们没有给出任何指导(甚至是经验法则)这个地方可能在哪里。

我没有遇到任何关于最大限度提高性能的文档 - 我认为AppFabric对于这些指南来说仍然太新了。我确实查看了Pro AppFabric book的内容,但它似乎更关注AppFabric的工作流程(都柏林)而不是缓存(Velocity)。

我会说一件事:你有没有可能缓存'chunkier'对象,这样你就可以减少对Get的调用?您是否可以缓存集合而不是单个对象,然后在客户端上解压缩集合?在每页加载700缓存似乎是一个巨大的数字!