AppFabric: большой кластер медленно реагирует по сравнению с маленьким кластером - PullRequest
3 голосов
/ 08 марта 2011

Я использую AppFabric для кэширования на моем сайте.Недавно мы добавили больше хостов в кластер кеша, и, вероятно, мы добавим еще больше в [среднем] будущем, мы решили перенастроить кластер как кластер большой , а не как маленький.Сейчас мы наблюдаем некоторые неприятные побочные эффекты, а именно: AppFabric потребуется много времени, чтобы вернуться после перезагрузки.

Хорошо, так что если вы зашли так далеко, я привлеку ваше внимание и могу сказать,ты полная история: о).После перезапуска 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;
        }
    }
}

Поскольку мы начали использовать конфигурацию большого кластера, это как если бы атрибут requestTimeoutзаписи конфигурации dataCacheClient не имеет никакого влияния.После ввода команды Restart-CacheCluster наш веб-сайт перестает отвечать на запросы в течение 3–5 минут, что означает, сколько времени в настоящее время требуется кластеру для повторного запуска после перезагрузки.

Чтобы устранить эту проблему, я сделал несколькотестирование на моей локальной машине, чтобы увидеть, сколько времени потребовалось загрузить домашнюю страницу веб-сайта после полного обновления ([ctrl] [f5]) с AppFabric в различных состояниях.Ниже приведены результаты (среднее время в секундах):

Малый кэш увеличен: 11,4462
Малый кэш отключен: 12,4346
Малый кэш перезапущен: 11,5794
Малый кэш перезапущен [1]: 14.99

Большой кэш увеличен: 11.5534
Большой кэш выключен: 16.576
Большой кэш перезапущен: 59.4582
Большой кэш перезапущен [1]: 62.9526

Как видноИсходя из результатов, приведенных выше, существует значительная разница между временем, которое требуется для нормальной загрузки домашней страницы, и после перезапуска AppFabric.

Если вам интересно, почему мы вообще перезапускаем кластер, мы иногдахотите аннулировать кэш с целью принудительного изменения значений, таких как параметры, которые имеют очень большой TTL, для немедленного вступления в силу.

[1] При повторном тесте повторного запуска атрибуты channelOpenTimeout и requestTimeout удаляются из сети..config

1 Ответ

1 голос
/ 19 мая 2011

Вы всегда можете перечислить все элементы кэша и удалить их из кэша. Таким образом, вы достигнете своей цели без перезапуска кеша.

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 серверов кеша, в то время как Большой означает более 15 серверов кеша. Когда вы перезапускаете кластер, это означает, что он должен остановить AppFabricCachingService на всех этих машинах, подождать, пока все они остановятся, а затем запустить их все и ждать всего этого.

...