AppFabric缓存服务崩溃

时间:2012-01-29 11:39:44

标签: caching appfabric

我在Windows 2008 R2 Enterprise 6位服务器上的IIS 7.5中托管了WCF 4.0服务。 WCF服务配置为使用ASP兼容性]。

在Production和QA环境中,我们有一个负载均衡的Web场。在开发中,我们只有一台服务器。我们使用AppFabric缓存作为我们的分布式缓存技术。

AppFabric缓存Windows服务每隔几周崩溃(无论是在Web场还是单一服务器拓扑中)。这与IIS AppPool停止一起发生;以及WCF Web应用程序。除了指示应用程序池已停止的Windows事件日志条目之外,没有其他可以识别的信息可以为我提供有关崩溃原因的任何线索。 WCF应用程序或AppPool的日志文件中没有任何内容。此外,我在WCF应用程序中的日志记录中没有显示任何内容 - 可能是因为在WCF代码运行之前IIS中的请求失败。

当系统未使用时,问题似乎在一夜之间发生 - 第一天请求失败。缓存设置为在新的一天工作开始前1小时到期。我没有服务器的可见性,以确定是否有任何隔夜服务器补丁/更新可能与问题有关(或者由于AppPool回收,缓存只是停止)。

我不是百分百肯定;但要预先知道缓存服务首先停止;然后下一个WCF请求导致AppPool崩溃。

我使用Unity框架(v5.0)进行依赖注入。以下是配置统一容器的代码:

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企业库缓存服务作为临时缓存机制。在WCF配置文件中,我仍然有企业库缓存配置部分 - 这样我就可以继续在我的Windows XP开发机器上使用缓存策略(没有AppFabric缓存)。我使用appSettings标志来指示将使用(a)AppFabric缓存或(b)企业库缓存服务中的哪一个。显然,在生产和QA环境中,AppFabric缓存被标记为使用。

我刚刚从web.config文件中删除了企业库设置;但是在我理解这是否已经消除了一些运行时冲突之前需要等待几周 - 如果两个缓存系统程序集都已加载。

任何想法都将不胜感激:

  1. 如果我将企业库缓存信息留在web.config文件中,是否可能会导致问题(请记住我如何只配置一个缓存系统通过Unity容器运行)?
  2. 我配置Unity DI容器[缓存和错误提供程序 - 单例]的方式有什么问题吗?
  3. 是否有一些我可以查看(或转向)AppFabric Cache的日志记录/或者可以在Cache配置文件中配置?
  4. 我是否需要明确处理通过Unity实现的任何对象?

1 个答案:

答案 0 :(得分:2)

一般来说,当发生崩溃时,监视服务器的IO系统(磁盘队列长度)。具体来说,检查您的备份代理/系统。

我看到AppFabric在试图访问其配置时超时崩溃。能够访问其配置非常敏感。我们在群集中使用AF,如果连接到SQL Server甚至短暂中断,我们就会看到崩溃。

我提到了备份系统,因为它可能是您的备份系统正在创建一个VSS快照,这会使机器“冻结”一下。这可能导致足够的IO延迟,AppFabric对无法查看其配置感到不满。这也可以解释您同时发生的AppPool问题。