我正在寻找最安全的方式来安排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
以下是论坛帖子的答案:
你好.很抱歉延迟回复,但我想说这些都是很好的问题,可能对其他人有用.
除非您需要不同的配置,否则每个线程不需要多个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()锁定的对象.
我希望这有帮助.就像我说的那样,我们希望尽快将这种类型的指导纳入一些正式的内容.但是直到那时最好在论坛上分享.谢谢!
杰森罗斯