需要开发Web服务器监控系统。可能有数百个Web服务器在不同的服务器上运行。该系统需要在给定的interva上监视每个Web服务并更新DB中的状态。
目前的选项设计。
选项1:创建类Monitorig它具有Method1,它定期调用webservice,例如10分钟。并将状态(失败/成功)数据存储到DB。
在for循环中,我每次创建一个新的监控类实例和一个新的Thread。
实施例
foreach(int i in idlist)
{
Monitoring monObj = new Monitoring();
Thread workerT = new Thread(monObj.MonitorWebService);
workerT.Start(i);
}
MonitorWebService API中的有一个无限循环 它以给定的间隔调用给定的webservice为1分钟或10分钟等。为了在常规的inverval中处理它我使用EventWaitHandle.WaitOne(T1 * 1000,false)而不是Thread.Sleep()。这里T1可以是1分钟或1或5小时。
Oprion 2:
在for循环中使用新名称打开一个新的appdomain并打开一个新的主题,如下所示。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);
}
在option2中,当时间间隔超过10分钟时,我正在卸载AppDomain。并且当它需要加载时。我认为选项2会在不需要时释放资源,并在需要时重新加载。
哪种方法最好/更好?我们有更好的解决方案吗?我们非常感谢快速帮助。
答案 0 :(得分:2)
首先:
选项2很糟糕。它不会卸载比选项1更多的数据。 .Net将在不再引用/需要时自动卸载所有应用程序数据。它只是不会卸载应用程序本身。但是在你的情况下,无论如何都无法卸载你的应用程序,所以在这里使用AppDomain是完全没用的。
选项1也不是非常好,因为(滥用)Threadsyncs用于定时具有巨大的开销并且永远不是一个好主意。
更好的选择是:
1)如果您不需要永久运行,只需让外部Windows任务计划程序在所需的时间调用您的应用程序。这样做的优点是可以从外部轻松配置,而且您根本不必担心代码中的任何时间。
2)如果你需要/想要永久运行,那么最简单明了的方法就是使用一个可用的Timer对象。
3)如果您不喜欢2)使用Thread.Sleep循环(不要试图滥用睡眠间隔进行计时,只需睡眠1分钟然后醒来并检查是否需要进行操作)。
答案 1 :(得分:0)
您是否考虑使用现有的网站监控解决方案,如Nagios,Pingdom或AlertFox?
我之所以提到这一点,是因为我们曾经拥有自己的本土监控系统,但随后放弃并将其外包。