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

Dar*_*der 12 .net c# fault-tolerance reliability

我一直在处理许多作为Windows服务或计划任务运行的应用程序.

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

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

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

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

Bra*_*ndi 7

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

  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.在Windows服务中使用的最佳计时器

  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

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