我们开发了一些长期运行的C#控制台应用程序,它们将由Windows计划任务运行。
这些应用程序可能在Intranet / Extranet上的许多不同服务器上运行。 我们无法确保它们在一台计算机上运行,因为每个应用程序可能需要访问某些资源,这些资源仅在某台计算机上可用。
但是,所有这些应用程序都使用通用的WCF服务来访问数据库。
我们需要确保我们的应用程序中只有一个实例随时运行。 由于应用程序可能位于不同的外联网计算机上,因此我们无法使用每台计算机的互斥锁或MSMQ。
我考虑过以下解决方案 - 带超时的WCF Mutex服务。当一个应用程序运行时,它会检查它是否已经启动(可能在另一台机器上),然后(在专用线程中)定期ping WCF Mutex服务以更新时间戳(如果ping失败,应用程序立即退出)。如果时间戳过期,这意味着应用程序已崩溃,因此可以再次运行。
我想知道,如果这个“WCF互斥体”是我问题的最佳解决方案。也许已经有一些第三方库实现了这样的功能?
答案 0 :(得分:1)
您的互斥解决方案存在竞争条件。
如果另一台服务器上的应用程序在时间戳到期后检查窗口中的时间戳,但在当前服务更新时间戳之前,您将运行两个实例。
我可能会走相反的路线。我有一个中央监控服务。该服务将持续监控系统的健康状况。如果它检测到服务中断,它将在该计算机或其他计算机上重新启动它。
您可能想要咬紧牙关并使用完整的企业服务总线。查看Wikipedia文章了解ESB。它列出了十几个商业和开源系统。
答案 1 :(得分:0)
WCF通常在IIS上运行。因此,当您调用WCF Mutex服务并且客户端等待锁定被释放时,直到调用超时,IIS中为该调用提供服务的线程将被阻止。这将限制该IIS服务器上的吞吐量,并且当可以服务的客户端发出对互斥锁的锁定请求时,它可能会启动错误。故事的道德,如果您要使用WCF,请不要在IIS中为该应用程序使用它,也不要编写自己的服务器应用程序来锁定和解锁互斥锁。
答案 2 :(得分:0)
网络位置上的文件锁定怎么样?
如果您可以使用独占读写创建/打开文件,那么它是唯一运行的应用程序。如果此运行的应用程序随后崩溃,则操作系统会自动释放锁定。
添
哎呀,只是重新阅读问题并看到“外联网”,不理我!