2011-05-22 18 views
5

Estoy desarrollando una aplicación web asp.net. Una característica de la aplicación es que el usuario puede poner en cola una cantidad de operaciones de ejecución larga, y luego presionar ejecutar la cola se procesará.Estrategia para gestionar procesos de larga ejecución en una aplicación web?

No quiero que el usuario tenga que sentarse y esperar a que se completen todas las operaciones o mantener el navegador/aplicación abierto. Sin embargo, si permanecen o vuelven a la página, me gustaría que puedan ver el estado de cada trabajo, es decir, en espera, en curso, completado o fallido.

Naturalmente, estoy buscando la solución más robusta, confiable y escalable ya que posiblemente haya una gran cantidad de trabajos en la cola en cualquier momento.

De mi investigación se ha sugerido que asp.net podría llamar al servicio de Windows? Que tal vez sea la sede de un servicio web de WCF.

Buscando cualquier consejo de alguien que pueda haber tenido un requisito similar en el pasado.

Respuesta

2

Un enfoque generalmente bueno es tener un servicio de Windows que realice trabajos programados. Puede usar una biblioteca como Quartz.NET que tiene todo tipo de funciones de programación. Si no necesita una programación específica, puede hacer que el servicio de Windows actúe como el proceso de trabajo y simplemente consuma los trabajos. Además de eso, debe facilitar la comunicación entre su aplicación web y el servicio que realiza las tareas puestas en cola. Puede utilizar una serie de técnicas para esto, como utilizar una tabla en la base de datos o simplemente usar otro tipo de técnica de comunicación entre procesos (remoto, canalizaciones con nombre, sockets, colas de mensajes, etc.).

De hecho, implementé algo como esto, donde hay un servicio de Windows que realiza trabajos programados y hay una aplicación web ASP.NET que está presentando todas las solicitudes para los trabajos. La aplicación ASP.NET publica algunos trabajos en la base de datos y estos son consumidos más tarde por el proceso de servicio.

+0

Como usted dice, no estoy estrictamente tratando de programar nada, pero Quartz.NET se ve muy interesante. Idealmente, me gusta llamar al servicio y decir que se ejecute después de agregar mis trabajos a la cola. Supongo que no hay mucho en esto si sondeo cada minuto más o menos ... – bigtv

+0

Sí, también puede usar MSMQ o un simple socket para indicarle a su servicio que hay nuevos trabajos disponibles. Aquí un poco más de información sobre IPC: http://stackoverflow.com/questions/50153/interprocess-communication-for-windows-in-c-net-2-0 –

+0

Encontrado este artículo que es bastante bueno - http: // msdn .microsoft.com/es-us/magazine/cc163482.aspx. – bigtv

1

El uso del servicio de Windows es una buena idea. Sin embargo, no tengo ninguna experiencia en usarlo y no conozco las trampas inesperadas.
Además, es posible que desee comprobar el patrón Fire And Forget. (Más información y ejemplos se pueden encontrar here) El uso de multi-threading podría ser otra opción. Para obtener más información, echa un vistazo a:
http://msdn.microsoft.com/en-us/magazine/cc163587.aspx
http://msdn.microsoft.com/en-us/magazine/cc164128.aspx#S6
http://msdn.microsoft.com/en-us/library/ff647332.aspx

5

También puedes ver MSMQ,

http://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx

Básicamente la aplicación web coloca el "trabajo" o "grupo de puestos de trabajo" en una fila.

El servicio se ejecuta constantemente, dequeueing el siguiente "trabajo" o "grupo de trabajos" y ponerse a trabajar con ellos.

Cuando se completa, el servicio coloca los resultados en otra cola o en un DB (u otro recurso compartido) al que accede la aplicación web y muestra el estado o los resultados de.

Disfrútalo.

+0

En cuanto a MSMQ se ve muy elegante, sin embargo, en mi caso, no estoy seguro de que pueda ver ningún beneficio con respecto al uso de una tabla de base de datos y ver eso en lugar de la cola, ¿me falta algo? – bigtv

+1

Depende, en su caso, puede ser innecesario, pero la integración de dicha cola puede resultar más confiable y escalable si su sistema necesita crecer. Para mantener un "mensaje de estado" decente, es probable que desee involucrar una base de datos independientemente. Solo te advierto que si utilizas la ruta del "hilo de fondo" lo estructuras de forma que funcione en un entorno con equilibrio de carga. – mikey

0

Tengo un problema similar. Tengo una aplicación web que inicia un largo proceso. Me gustaría actualizar la UI para que el usuario vea qué está pasando.Tengo una clase que obtiene algunas propiedades establecidas y luego comienza el proceso. Aquí está mi enfoque.

1) agregar una propiedad a mi clase, identificación del trabajo.
2) cuando el usuario web inicie el trabajo, genere una nueva identificación de trabajo y asígnela a la propiedad anterior.
3) como mi clase sigue su curso, actualice una tabla de registro en un db. actualizarlo en función de la identificación del trabajo.
4) en la parte delantera, tenga algún proceso ajax simple para verificar el estado de la identificación del trabajo cada x segundos.

Eso es todo.

Cuestiones relacionadas