2010-08-06 51 views
2

需要开发一个Web服务器监控系统。可能有数百个网络服务器在不同的服务器上运行。这个系统需要监视每个web服务在给定的interva上并更新数据库中的状态。我需要开发一个web服务监控.net应用程序。什么是最好的设计方法

设计的当前选项。

选项1:创建的类Monitorig它有Method1动态调用Web服务的定期间隔说10分钟。并将状态(失败/成功)数据存储到数据库。

在for循环中,我每次都创建一个监视类的新实例,并创建一个新线程。

例子。

foreach(int i in idlist) 
{ 
Monitoring monObj = new Monitoring(); 
Thread workerT = new Thread(monObj.MonitorWebService); 
workerT.Start(i); 
} 
的MonitorWebService API中

存在用于循环 ,其不以给定间隔调用web服务给定的如1分钟或10分钟等。为了在我使用的EventWaitHandle常规inverval处理此一无穷大。 WaitOne(T1 * 1000,false)而不是Thread.Sleep()。这里T1可以是1分钟或1或5小时。

Oprion 2:

在for循环打开与新名称的新应用程序域,并打开一个新的线程

为如下。

foreach(int i in idlist) 
{ 
string appDNname = WSMonitor + i.ToString(); 
AppDomain WMSObj = AppDomain.CreateDomain(appDNname); 
Type t= typeof(Monitoring); 
Monitoring monWSObj = (Monitoring) WMSObj.CreateInstanceAndUnwrap(Assembly.GetExecuti ngAssembly().FullName, t.FullName); 
Thread WorkerT = new Thread(monWSObj.MonitorWebService); 
WorkerT.Start(i); 
} 

in option2我在卸载AppDomain的时间间隔超过10分钟。并且当它需要加载时。我认为选项2将在不需要时释放资源,并在需要时重新加载。

哪个是最好的/更好的方法?我们有更好的解决方案吗?快速帮助非常感谢。

回答

2

首先:

选项2不好。它不会卸载比您的选项1更多的数据。 。当它不再被引用/需要时,.Net将自动卸载所有的应用程序数据。它只是不会卸载应用程序本身。但在你的情况下,你无法卸载你的应用程序本身,所以使用AppDomain在这里完全没用。

选项1并不是非常好,要么是因为(滥用)线程同步的时间有很大的开销,并不是一个好主意。

更好的选择是:

1)如果您并不需要永久运行只是有外窗的任务调度程序在需要的时候打电话给你的应用程序。这样做的好处是可以很容易地从外部进行配置,而且您不必担心代码中的任何时间。 2)如果你需要/想永久运行,那么最简单明了的方法就是使用一个可用的Timer对象。

3)如果你不喜欢2)使用Thread.Sleep循环(不要试图滥用睡眠间隔时间,只是睡1分钟,然后醒来,并检查是否需要完成)。

+0

+1作为计划任务运行;微软为我们提供了一段时间的基础架构,可以在给定的时间/间隔内运行任务,并在Vista/Windows 7中作为对事件发生的响应,这是疯狂的,而不是使用它。 – Rob 2010-08-06 14:10:29

0

您是否考虑过使用现有的网站监控解决方案,如Nagios,Pingdom或AlertFox?

我提到这一点是因为我们曾经拥有自己的本土监测系统,但后来放弃了它并将其外包。

相关问题