Сбой службы AppFabric Caching - PullRequest
2 голосов
/ 29 января 2012

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

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

Служба Windows кэширования AppFabric аварийно завершает работу каждые несколько недель (независимо от топографии веб-фермы или одного сервера). Это происходит в связи с остановкой 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 у меня все еще есть раздел конфигурации кэширования Enterprise Library - так что я могу продолжать использовать стратегию кэширования на моей машине для разработки под 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 Ответ

2 голосов
/ 15 августа 2012

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

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

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

...