AppFabric:与小型集群相比,大型集群响应缓慢

时间:2011-03-07 22:34:33

标签: appfabric

我在我的网站上使用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属性

1 个答案:

答案 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,等待它们全部停止然后再启动它们并等待所有这些。