每个网络一个应用程序实例

我们开发了一些长时间运行的C#控制台应用程序,这些应用程序将由Windows计划任务运行。

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

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

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

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

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


你互斥解决方案有一个竞争条件。

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

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

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


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


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

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

蒂姆

哎呀,只要重新阅读问题,看到“外联网”,不理我!

链接地址: http://www.djcxy.com/p/51165.html

上一篇: Single application instance per network

下一篇: Restrict application to one instance per shell session on Windows