Сбой службы AppFabric Caching

У меня есть служба WCF 4.0, размещенная в IIS 7.5 на 6-битных серверах Windows 2008 R2 Enterprise. Служба WCF настроена на использование ASP-совместимости].

В средах Production и QA у нас есть веб-ферма с балансировкой нагрузки. В разработке у нас только один сервер. Мы используем AppFabric Caching в качестве нашей технологии распределенного кэширования.

Служба Windows AppFabric Caching выходит из строя каждые несколько недель (независимо от веб-фермы или топографии одного сервера). Это происходит в связи с остановкой IIS AppPool; а также веб-приложение WCF. Кроме записи в журнале событий Windows, указывающей, что пул приложений остановлен, нет никакой другой информации, которую я могу определить, которая дает мне какие-либо подсказки относительно причины сбоя. В файлах журнала нет ничего для приложения WCF или AppPool. Кроме того, в моем журнале в приложении WCF ничего не показано - возможно, потому что запрос завершается неудачно в IIS до запуска кода WCF.

Кажется, проблема возникает в одночасье, когда система не используется - первый запрос на следующий день завершается неудачно. Срок действия кэша истекает за 1 час до начала работы в новый день. У меня нет видимости серверов, чтобы установить, могут ли какие-либо ночные исправления / обновления сервера быть связаны с проблемой (или если кэш просто останавливается, потому что AppPool перезагружается).

Я не уверен на 100%; но есть догадка, что служба Cache останавливается первой; и затем следующий запрос WCF вызывает сбой AppPool.

Я использую инфраструктуру Unity (v5.0) для внедрения зависимостей. Ниже приведен код для настройки контейнера Unity:

public void Configure(IUnityContainer container)
{
    container.RegisterType<ICacheExpireCalculator, CacheExpireCalculatorCMF>("CMF_Cache_ExpiryCalculator", new InjectionMember[] { new InjectionConstructor(new object[] { ConfigurationManager.AppSettings["expireCacheDailyTimeUTC_HHmm"] }) });
if (bool.Parse(ConfigurationManager.AppSettings["useAppFabricCache"]))
{
    container.RegisterType<ICache, CacheAppFabricCMF>(new ContainerControlledLifetimeManager(), new InjectionMember[0]);
}
else
{
    container.RegisterType<ICache, CacheEntlibCMF>(new ContainerControlledLifetimeManager(), new InjectionMember[0]);
}
container.RegisterType<IJBADataAccess, JBADataAccess>("JbaDataDataAccess", new InjectionMember[] { new InjectionConstructor(new object[] { "jbaConnection" }) });
container.RegisterType<ISqlDataAccess, SqlDataAccess>("SQLDataDataAccess", new InjectionMember[0]);
container.RegisterType<IErrorProvider, CustomErrorProvider>(new ContainerControlledLifetimeManager(), new InjectionMember[0]);
container.RegisterType<IBusinessCMF, BusinessCMF>(new InjectionMember[0]);
container.RegisterType<IDataLookupLoader, DataLookupLoader>(new InjectionMember[0]);
container.RegisterType<IQueryHelper, QueryHelper>(new InjectionMember[0]);

}

Когда я начал разрабатывать решение, я использовал службу кэширования Microsoft Enterprise Library в качестве механизма временного кэширования. В файле конфигурации WCF у меня все еще есть раздел конфигураций кэширования библиотеки предприятия - так что я могу продолжать использовать стратегию кэширования на моей машине для разработки под Windows XP (без кэширования AppFabric). Я использую флаг appSettings, чтобы указать, какой из (a) кэширования AppFabric или (b) кэширования библиотеки предприятия будет использоваться. Очевидно, что в производственных средах и средах контроля качества AppFabric Caching помечен для использования.

Я только что удалил настройки библиотеки Enterprise из файла web.config; но нужно будет подождать несколько недель, прежде чем я пойму, устранил ли это какой-то конфликт времени выполнения - если загружены обе сборки системы кэширования.

Любые мысли будут оценены:

  1. Может ли это вызвать проблемы, если я оставлю информацию о кэшировании библиотеки Enterprise в файле web.config (имея в виду, как настроить только одну систему кэширования для запуска через контейнер Unity)?
  2. Есть ли какие-либо проблемы в настройке контейнера Unity DI [поставщик кэша и ошибок - синглтоны]?
  3. Есть ли какие-либо журналы, которые я могу просмотреть (или включить) для AppFabric Cache / или настроить в файлах конфигурации Cache?
  4. Нужно ли явно уничтожать какой-либо объект, созданный с помощью Unity?

1 ответ

Решение

Вообще говоря, отслеживайте систему ввода-вывода (длину очереди диска) серверов, когда происходит сбой. В частности, проверьте ваш агент / систему резервного копирования.

Я видел сбой AppFabric, когда тайм-аут пытался получить доступ к его конфигурации. Он ОЧЕНЬ чувствителен к возможности доступа к его конфигурации. Мы используем AF в кластере, и мы видим сбои, если подключение к SQL Server прерывается даже на короткое время.

Я упоминаю о системе резервного копирования, потому что может случиться так, что ваша система резервного копирования создает снимок VSS, который немного "замораживает" машину. Это может вызывать достаточную задержку ввода-вывода, из-за которой AppFabric становится недовольным невозможностью увидеть его конфигурацию. Это также может объяснить ваши проблемы AppPool, которые возникают в то же время.

Другие вопросы по тегам