lunes, 15 de diciembre de 2014

HangFire para .net o como rellenar el gap de la gestión de colas de procesos

El otro día nos propusieron para la evolución de una funcionalidad en uno de los proyectos que llevamos el uso de la tecnología HangFire. Nos resultó interesante dado que llena el vacío existente en .NET para la gestión de colas de procesos pendientes, así que haremos una prueba de esta tecnología para incorporarla a uno de nuestros proyectos. A continuación vamos a explicar un poco en que consiste.

Correr procesos .Net en background tiene sus riesgos (remito a la siguiente dirección en la que se analizan más detalladamente estos problemas peligros de los procesos background en .NET ). En resumen lo que dice el articulo es que:
  • Una excepción no tratada en un hilo no asociado a una petición hará caer el proceso en background.
  • Si ejecutas el sitio en una granja de servidores, se puede acabar con multiples instancias de tu aplicación, todas intentando ejecutar la misma tarea en el mismo tiempo
  • El AppDomain que ejecuta tu sitio se puede caer por múltiples razones y esto interrumpirá definitivamente la tarea en background con ello
Existe muchas formas de hacer las cosas en background y gran cantidad de librerías y otras opciones disponibles. El espectro de opciones son las siguientes:
  • Hangfire u otras librerías opensource: usado para escribir tareas en background en un website en ASP.NET
  • Cloud: Azure WebJobs: una característica de Azure usada para ejecutar tareas en background fuera del website
  • Advanced: Azure Worker Role en un Servicio en la nube: para escalar carga de procesos en background independientemente del Website
Aparte de Hangfire existen otras opciones como QUEUEBACKGROUNDWORKITEM añadido en .NET 4.5.2, FluentScheduler y Quartz.net.

Hangfire es un framework que está muy bien documentado. Esta soportado por SQL Server, SQL Azure, MSQM o RabbitMQ. Una de las mejores características es el dsahborad que incluye y que muestra todos los trabajos programados, en ejecución, que han terminado con éxito o que han producido algún error



En Hangfire es posible encolar trabajos fácilmente y se apoya en colas persistentes

BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));


Se pueden retrasar

BackgroundJob.Schedule(() => Console.WriteLine("Delayed"), TimeSpan.FromDays(1));
 
O ejecutarla de forma periódica
 
RecurringJob.AddOrUpdate(() => Console.Write("Recurring"), Cron.Daily);
 
Aquí les dejo un tutorial para profundizar más tutorial hangfire
 

No hay comentarios:

Publicar un comentario