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