我正在寻找最有效的方法来安排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
答案 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缓存似乎是一个巨大的数字!