2010-05-27 8 views
11

He estado trabajando en muchas aplicaciones que se ejecutan como servicio de Windows o tareas programadas.Mejores prácticas de tolerancia a errores y confiabilidad para tareas o servicios programados

Ahora, quiero asegurarme de que estas aplicaciones sean tolerantes a fallas y confiables. Por ejemplo; tengo un servicio que se ejecuta cada hora. si el servicio se bloquea mientras está en funcionamiento o en ejecución, me gustaría que la aplicación se ejecute nuevamente durante el mismo período (hay varias cosas involucradas en esto, incluidas las transacciones de procesamiento de datos), para evitar la pérdida de datos. además, me gustaría que el programa informe el error con detalles. Mi objetivo es evitar la pérdida de datos y no quedarme atrás para ejecutar el programa.

He creado una biblioteca de clases que un usuario puede importar a un proyecto. Se supone que la biblioteca guarda la información de la ejecución de la instancia del programa, es decir. programa lee y escribe información de intervalo de ejecución, estado de ejecución, etc. Estos datos se almacenan en una base de datos.

Tenía curiosidad, si hay algunas prácticas recomendadas para que las tareas programadas/servicios de Windows sean tolerantes y confiables.

Editar: Estoy hablando de tareas independientes o servicios que en diferentes servidores. y mi objetivo es asegurarme de que el servicio seguirá funcionando, informar cualquier falla y recuperarme de ellos.

+0

¡Me lo estaba preguntando! – Brandi

+0

El mejor anunciado que he encontrado es FireDaemon. No estoy seguro de cómo funciona, estoy en el medio de examinarlo ahora. Pero sus características anunciadas son geniales. –

+0

Gracias, lo compré. Prefiero codificarlo y tener control sobre él. – DarthVader

Respuesta

6

estoy interesado en lo que otras personas tienen que decir, pero te daré algunos puntos que he tropezado a través de:

  1. Hacer un controlador de eventos para las excepciones no controladas. De esta forma puede limpiar los recursos, escribir en un archivo de registro, enviar un correo electrónico a un administrador o cualquier cosa que necesite en lugar de bloquearlo.

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

  2. Anule los controladores de eventos de la base de servicio que necesite en la parte principal de la aplicación. OnStart y OnStop son bastante cruciales, pero hay muchos otros que puede usar. http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase%28v=VS.71%29.aspx

  3. Cuidado con los temporizadores. Los temporizadores de formularios de Windows no funcionarán correctamente en un servicio. Sistema de usuario.Threading.Timers o System.Timers.Timer. Best Timer for using in a Windows service

  4. Si está actualizando en un hilo, asegúrese de usar un candado() o un monitor en las secciones clave para asegurarse de que todo sea seguro para la rosca.

  5. Tenga cuidado de no utilizar nada específico del usuario, ya que un servicio se ejecuta sin un contexto de usuario específico. Me di cuenta de que algunas de mis cadenas de conexión SQL ya no funcionaban para las autorizaciones de Windows, etc. También escuché personas que tenían problemas con las unidades mapeadas.

  6. Nunca haga un servicio con una IU. De hecho, para Vista y 7 hacen que sea casi imposible hacerlo de todos modos.No debe requerir la interacción del usuario, lo máximo que puede hacer es enviar un mensaje con una función WIN32. MSDN afirma que hacer servicios interactivos es una mala práctica. http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx

  7. Para la depuración, es genial hacer que un servicio se ejecute como una aplicación de consola hasta que lo haga haciendo lo que quiere. tutorial impresionante: http://mycomponent.blogspot.com/2009/04/create-debug-install-windows-service-in.html

De todos modos, espero que ayude un poco, pero eso es sólo una cosa par Asomé alrededor para encontrar por mi cuenta.

0

Algo obvio: no ejecute todas sus tareas al mismo tiempo. Intente programarlos para que solo una tarea use algún recurso costoso en cualquier momento (si es posible). Por ejemplo, si necesita enviar boletines informativos y algunas notificaciones específicas, prográmelas en horarios diferentes. Si dos tareas necesitan limpiar algo en la base de datos, deje que una funcione después de otra.

También programe las tareas para que se ejecuten fuera del horario comercial normal, por la noche obviamente.

+0

Estaba hablando de tareas o servicios independientes que en diferentes servidores. y mi objetivo es asegurarme de que el servicio siga funcionando, informar cualquier falla y recuperarme de ellos con una pérdida de datos mínima o nula. – DarthVader

Cuestiones relacionadas