我在我的网站上使用AppFabric进行缓存。我们最近在缓存集群中添加了更多主机,因为我们可能会在[中]未来添加更多主机,所以我们决定将集群重新配置为大型集群而不是小集群。我们现在看到一些令人不安的副作用 - 即AppFabric在重启后需要很长时间才能恢复。
好的,所以如果你已经走到这一步,我已经引起了你的注意,我可以告诉你完整的故事:O)。 AppFabric在重启后总是需要很长时间才能恢复,但我们能够为此配置和编码,以便我们的用户看到没有不利影响。在web.config中我们有:
<dataCacheClient channelOpenTimeout="5" requestTimeout="1000" >
<!-- cache host(s) -->
<hosts>
<host name="localhost" cachePort="22233"/>
</hosts>
</dataCacheClient>
除非我误解了文档,否则将导致AppFabric客户端在1秒内未收到响应时抛出异常。在我们的代码中,我们处理这个并回过头来读取我们试图直接从数据库中读取的数据:
public object Get(object key)
{
if ( key == null )
{
return null;
}
try
{
return cache[key.ToString()];
}
catch ( CacheException ex )
{
if ( ex.ErrorCode == DataCacheErrorCode.ConnectionTerminated || ex.ErrorCode == DataCacheErrorCode.RetryLater || ex.ErrorCode == DataCacheErrorCode.Timeout )
{
// Calling code should try reading from the database instead
return null;
}
else
{
throw;
}
}
}
由于我们已经开始使用大型群集配置,因此就好像dataCacheClient配置条目的requestTimeout属性没有任何影响。发出Restart-CacheCluster命令后,我们的网站停止响应3到5分钟,这是关于群集在重新启动后重新恢复所需的时间。
为了进一步排除故障,我在我的本地计算机上做了一些测试,看看在各种状态下使用AppFabric完全刷新([ctrl] [f5])后网站的主页加载了多长时间。结果如下(时间是以秒为单位的平均时间):
小缓存:11.4462
小缓存:12.4346
Small Cache重新启动:11.5794
小缓存重新启动[1]:14.99
大缓存:11.5534
大缓存:16.576
重启大缓存:59.4582
大缓存重新启动[1]:62.9526
从上面的结果可以看出,主页正常加载和重新启动AppFabric所需的时间之间存在显着差异。
如果您想知道我们为什么要重新启动集群,我们有时希望使缓存无效以强制更改值,例如具有非常大的TTL的设置,以立即生效。
[1]第二次重启测试是从web.config中删除了channelOpenTimeout和requestTimeout属性
答案 0 :(得分:1)
您始终可以枚举所有缓存项并将其从缓存中删除。这样您就可以在不重新启动缓存的情况下实现目标。
DataCache cache; // TODO: initialize
foreach (var regionName in cache.GetSystemRegions())
{
Trace.WriteLine(string.Format("Enumerating objects in region '{0}'", regionName));
foreach (var item in cache.GetObjectsInRegion(regionName))
{
Trace.WriteLine(string.Format("Removing cache item '{0}'", item.Key));
cache.Remove(item.Key);
}
}
小缓存群集意味着1-5个缓存服务器,而Large意味着超过15个缓存服务器。当你重新启动集群时,这意味着它必须在所有这些机器上停止AppFabricCachingService,等待它们全部停止然后再启动它们并等待所有这些。