繁体   English   中英

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

[英]Best Practices of fault toleration and reliability for scheduled tasks or services

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

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

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

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

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

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

  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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM