2012-08-23 37 views
0

我们开发了一些长期运行的C#控制台应用程序,这些应用程序将由Windows计划任务运行。每个网络的单个应用程序实例

这些应用程序可能在Intranet/Extranet上的许多不同服务器上运行。 我们无法确保它们在一台机器上运行,因为每个应用程序可能需要访问某些资源,这些资源仅在特定机器上可用。

尽管如此,所有这些应用程序都使用通用的WCF服务来访问数据库。

我们需要确保在任何时候只有一个应用程序正在运行。 由于应用程序可能位于不同的外联网计算机上,因此我们无法使用每台计算机互斥体或MSMQ。

我想过以下解决方案 - 带超时的WCF互斥服务。当一个应用程序运行时,它会检查它是否已启动(可能在另一台机器上),然后(在专用线程中)定期ping通WCF互斥服务以更新时间戳(如果ping失败,应用程序立即退出)。如果时间戳已过期,这意味着应用程序已崩溃,因此可以再次运行。

我想知道,如果这个“WCF互斥量”是我的问题的最佳解决方案。也许已经有一些第三方库实现了这种功能?

回答

0

WCF通常运行在IIS上。因此,当您对WCF Mutex服务进行调用并且客户端等待释放该锁时,直到该调用超时为止,为该调用提供服务的IIS中的线程将基本上被阻止。这将限制该IIS服务器上的吞吐量,并且当更多的客户端可以为互斥锁上的锁提出请求时,它可能会启动错误。这个故事的道德,如果你打算使用WCF,不要在IIS中使用它,或者编写你自己的服务器应用程序,以允许锁定和解锁互斥体。

+0

不,我不是说服务会等待一个“互斥体”才能发布。这更像是一个周期性的ping/keep-alive。控制台应用程序只是向WCF服务发出请求,WCF服务会更新数据库中的互斥时间戳,然后请求返回。同一应用程序的任何其他实例都会检查服务器上是否存在有效的“互斥体”,如果“互斥体”时间戳尚未过期,则退出。 – JustAMartin

1

您互斥解决方案有竞争条件。

如果不同服务器上的应用程序在时间戳过期后检查窗口中的时间戳,但在当前服务更新时间戳之前,您将有两个实例在运行。

我可能会走相反的路线。我有一个中央监控服务。这项服务将不断监测系统的健康状况。如果它检测到服务停止运行,它将在该计算机或其他计算机上重新启动它。

您可能想咬牙切齿,并使用完整的企业服务总线。查看维基百科文章中的ESB。它列出了十多个商业和开源系统。

+0

感谢有关竞赛条件的通知。我想,如果到期超时大于保活请求期,我可以解决它。对于我的应用程序来说,等待20-30分钟后,运行实例退出后,这不是问题。 – JustAMartin

0

网络位置上的文件锁定如何?

如果您可以使用独占读写创建/打开文件,那么它是唯一运行的应用程序。如果这个正在运行的应用程序随后崩溃,则该锁由操作系统自动释放。

哎呀,只是重新阅读的问题,并看到了“外网”,不理我!

相关问题