我们正在尝试为Windows编写服务,并且需要提出冗余计划,这样如果应用程序中的某些内容失败,它就会重新启动。我想知道我是否可以使用多线程来实现这一目标。
我的想法是创建两个线程,每个线程处理不同的任务。我想让每个线程监视另一个线程以确保它仍然在运行,如果不是,那么它应该启动该线程的新实例。 这听起来可行吗?我将使用什么线程技术:互斥,共享内存,信号量等......? 如果这不是正确的方法,那么可能是什么,只需编写两个单独的服务并使用IPC?
答案 0 :(得分:4)
让您的服务在失败时重新启动的最简单方法是让Windows执行此操作。您只需将服务配置为自动重启,它非常简单。您也可以在服务安装程序中以编程方式执行此操作。有关如何执行此操作的指南,请参阅此帖子:Building a Windows Service – Part 4: Extending the Service Installer。
对于这提供“冗余”,这不是。冗余的正确定义意味着您拥有多个冗余。这可能是使用多个服务,或者更有可能在多个主机上使用多个服务。在单个主机上拥有多个服务更容易,因为您可以根据需要使用互斥锁进行同步。
真正的问题是这项服务在做什么?
如果您的服务正在轮询任务,例如从数据库或消息队列中进行轮询,则会为您处理同步。只需建模您的数据库,以便多个服务都可以独立运行和处理工作,而无需重复工作。现在你有了冗余。
答案 1 :(得分:3)
是的,这听起来像是一个可行的解决方案。双线程的唯一问题是如果应用程序崩溃,那么两个线程都会死掉(如果它们是后台线程) 我发现对这个问题有用的解决方案是有一个看门狗进程。每当工作进程崩溃时,监视程序就会启动并创建一个新实例并运行它。
答案 2 :(得分:2)
您只需将应用程序编写为Windows服务使用的类库(visual studio中的模板,您将需要添加安装程序)。 如果您以这种方式运行应用程序,您可以随时选择设置行为,如果某些内容失败,即始终重启,重新启动几次,然后发送电子邮件给某人或运行此其他应用程序等强>
它内置于您拥有凭据的任何Windows框中,所有的辛勤工作都为您完成。对于我需要始终保持正常运行的服务而言,这总是毫无疑问。
要做到这一点,您只需将服务类型设置为自动(如果您的盒子重新启动,这将重新启动它),然后您可以根据需要设置所需的前三次重启所需的选项。 {3}}在服务部分。
更多信息: management window
答案 3 :(得分:0)
我发现,涵盖各种案例的最强大的解决方案是有一个监视程序,可以启动和停止工作进程。您将使用WCF在进程之间来回发送信号(或其他信息)。我们的想法是保持监视程序的简单过程,以便在执行有限的任务时几乎不会失败。然后将所有风险逻辑放在工作进程中。
提出一个协议,用于将失败或工作进程的健康状况传达给监督进程。这里有一些想法。这份清单绝不是一份详尽的清单。
除最后一项外,Windows服务控制管理器无法处理其他3种情况。这就是我喜欢看门狗流程理念的原因之一。另一个原因是因为你的主要逻辑可能挂断了阻塞调用。由于Thread.Abort
不会被推荐,因为它会破坏状态,除了杀死工作进程之外,你真的很少有选择。
另外,尝试使主逻辑尽可能容错。这样,如果你确实需要强行终止它,那么恢复和清理它留下的混乱就容易得多。这可能意味着使用像DB事务或聪明的文件操作这样的原子操作。