自定义Windows服务的一般要求

看了几个同事写的Windows服务,觉得有些基本要求需要再重申一下,现总结如下:

 

  • 可靠性要求
    • 保证多个线程或进程不会重复执行相同的任务.
    • 要维护任务执行过程中不同阶段的不同状态的切换
    • 保证所有异常都能被捕获, 异常的描述信息和堆栈要求被完整记录到日志中.
    • 一般情况下,尽可能在程序代码的最外层捕获异常.内部代码可以对异常进行捕获处理后再抛出(使用throw语法)
    • 有出错重试机制.但应限制重试次数.
    • 有超时重试机制.但应限制重试次数.
    • 在服务状态改变时(如启动和停止)记录系统日志.
    • 在服务被停止时,需要保证正在执行的任务能执行完整后再退出.
  • 多线程机制
    • 如果执行的任务可拆分成多个可同时执行的独立小任务, 考虑使用多线程机制.
    • 采用多线程机制时,优先使用ThreadPool.QueueUserWorkItem等方法管理线程
    • 要检查并约束当前线程池的线程数不能超过一个指定的值.
  • 可用性要求
    • 对任务进行优先级划分, 支持按照优先级高低执行任务,并且可以动态调整待执行任务的优先级.
    • 提供查看当前服务运行状态的办法(可以是一个SQL脚本),至少应包含:
      按一定时间范围统计(时间范围可动态调整,如果范围够窄,就能体现任务执行速率)
      • 已执行成功的任务数;
      • 正在执行的任务数;
      • 已执行失败的任务数;
      • 失败原因明细(失败原因及每个失败原因对应的任务数);
      • 待执行的任务数.
  • 性能要求:
    • 保证合理使用内存. 不要一次性放置太多数据在内存中,任何时候都应该获取限定个数的任务信息(如使用Select TOP 10...)
    • 提供性能优化的相关信息. 在关键的可能耗时较长的位置提供日志级别为4(Info)Time Count代码(使用Stopwatch对象), 以方便通过日志查看程序运行的性能情况.这样可以随时通过降低日志级别而屏蔽这些多余的日志信息.
    • 对于多线程执行的任务, 要注意合理使用共享的对象,确保线程安全. 对于特别消耗资源的对象(Sharepoint SPWeb,数据库连接等),请使用using语法以保证资源适时释放.
    • 其他一般的性能要求.如尽可能减少数据库访问等.
  • 可配置性要求:
    • 任务执行频率可配置
    • 并发任务数可配置.优先配置为CPU核心个数.
    • 超时重试的超时时间可配置
    • 出错重试和超时重试的次数可配置

 

posted @ 2010-06-21 15:52  ASeign  阅读(555)  评论(0编辑  收藏  举报