计划任务或服务的容错和可靠性的最佳实践

时间:2010-05-27 15:39:35

标签: c# .net reliability fault-tolerance

我一直致力于许多以Windows服务或计划任务运行的应用程序。

现在,我想确保这些应用程序具有容错性和可靠性。例如;我有一个每小时运行一次的服务。如果服务在其运行或运行时崩溃,我希望应用程序在同一时间段内再次运行(包括涉及数据处理事务的几件事),以避免数据丢失。此外,我希望程序报告错误的详细信息。我的目标是避免数据丢失,并且不会因为运行程序而落后。

我构建了一个用户可以导入项目的类库。库应该保存程序运行实例的信息,即。程序读取和写入运行间隔,运行状态等信息。该数据存储在数据库中。

我很好奇,如果有一些最佳实践可以使计划任务/ Windows服务具有容错性和可靠性。

编辑:我在谈论在不同服务器上的独立任务或服务。我的目标是确保服务继续运行,报告任何故障并从中恢复。

2 个答案:

答案 0 :(得分:6)

我对其他人的评论感兴趣,但我会给你一些我偶然发现的观点:

  1. 为Unhandled Exceptions创建一个事件处理程序。通过这种方式,您可以清理资源,写入日志文件,通过电子邮件发送管理员或任何您需要的内容,而不是让它崩溃。

    AppDomain.CurrentDomain.UnhandledException + = new UnhandledExceptionEventHandler(AppUnhandledExceptionEventHandler);

  2. 在应用程序的主要部分覆盖您需要的所有servicebase事件处理程序。 OnStart和OnStop非常重要,但您可以使用许多其他功能。 http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase%28v=VS.71%29.aspx

  3. 小心计时器。 Windows表单计时器无法在服务中正常工作。 User System.Threading.Timers或System.Timers.Timer。 Best Timer for using in a Windows service

  4. 如果要更新线程,请确保在关键部分使用lock()或monitor来确保所有内容都是线程安全的。

  5. 小心不要使用任何特定于用户的内容,因为服务在没有特定用户上下文的情况下运行。我注意到我的一些SQL连接字符串不再适用于Windows授权等。还听说过人们在映射驱动器时遇到问题。

  6. 永远不要使用UI进行服务。事实上,对于Vista和7,它们几乎不可能做到。它不应该要求用户交互,你可以做的最多就是发送一个带WIN32功能的消息。 MSDN声称制作互动服务是不好的做法。 http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx

  7. 出于调试目的,将服务作为控制台应用程序运行是很酷的,直到您按照自己的意愿运行它。很棒的教程:http://mycomponent.blogspot.com/2009/04/create-debug-install-windows-service-in.html

  8. 无论如何,希望有所帮助,但这只是我自己找到的几件事。

答案 1 :(得分:0)

显而易见的事情 - 不要同时运行所有任务。尝试安排它们,以便任何时候只有一个任务使用一些昂贵的资源(如果可能的话)。例如,如果您需要发送简报和一些特定通知,请在不同时间安排它们。如果两个任务需要清理数据库中的某些内容,请让它们一个接一个地运行。

还安排任务在正常工作时间之外运行 - 显然是在夜间。