当前位置:  开发笔记 > 运维 > 正文

AppFabric缓存 - 正确使用DataCacheFactory和DataCache

如何解决《AppFabric缓存-正确使用DataCacheFactory和DataCache》经验,为你挑选了1个好方法。

我正在寻找最安全的方式来安排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实例创建与服务器的连接(例如, .g如果有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



1> CRice..:

以下是论坛帖子的答案:

你好.很抱歉延迟回复,但我想说这些都是很好的问题,可能对其他人有用.

除非您需要不同的配置,否则每个线程不需要多个DataCacheFactory.例如,如果以编程方式使用DataCacheFactoryConfiguration类配置DataCacheFactory,则可能需要创建一个启用了本地缓存而另一个不启用本地缓存的类.在这种情况下,您将使用不同的DataCacheFactory对象,具体取决于您的方案所需的配置.但除了配置上的差异之外,您不应该通过创建多个DataCacheFactories来获得性能提升.

在同一主题上,有一个MaxConnectionsToServer设置(在DataCacheFactoryConfiguration中或在应用程序配置文件中是编程的,作为dataCacheClient元素的属性).这确定了打开到缓存集群的每个DataCacheFactory的chennel数量.如果您具有高吞吐量要求以及可用的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()锁定的对象.

我希望这有帮助.就像我说的那样,我们希望尽快将这种类型的指导纳入一些正式的内容.但是直到那时最好在论坛上分享.谢谢!

杰森罗斯


MaxConnectionsToServer是一个功能强大的配置设置.它提供了并行性而没有明确的编码.确保实现逻辑以捕获DataCacheExceptions并查找RetryLater的ErrorCode或Timeout以进行重试,因为冲突可能更频繁地发生.
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有