2011-11-27 36 views
5

Tengo una función simple Azure Worker ejecutándose que realiza una tarea cada pocos segundos. A continuación se muestra el código que logra esto.Realizar tareas a diferentes intervalos en Azure Worker Role

public override void Run() 
    { 
     try 
     { 
      while (true) 
      { 
       DoSomething(); 
       System.Threading.Thread.Sleep(3000); 
      } 

     } 
     catch (Exception ex) 
     { 
      Log.Add(ex, true); 
     }    
    } 

Lo que me gustaría hacer ahora es añadir una segunda tarea DoSomethingElse() que dispara una vez y sólo una vez al día. He pensado en un par de maneras de lograr esto:

  1. Añadir un contador que llama a la nueva tarea cada bucle enésimo
  2. Añadir lógica condicional para la nueva tarea que compara el tiempo actual en un tiempo prescrito de
  3. día
  4. usan alguna biblioteca TBD planificador (como Quartz.NET)

las dos primeras soluciones me parecen muy frágil y sin código adicional para hacer frente a situaciones en las que el servicio se detiene y reinicia. La tercera solución me parece potencialmente excesiva.

Mi pregunta es, ¿cuál es la mejor práctica para programar tareas en diferentes intervalos dentro de una función de trabajador de Azure? Tengo una ligera preferencia por seguir con .NET directo y no usar una biblioteca de terceros (aunque no estoy descartando).

Nota, # 3 anterior proviene de esta cuestión mayores Recommend a C# Task Scheduling Library

Respuesta

2

Las primeras dos opciones son las más simples pero son frágiles - sobre todo en la nube donde los roles se pueden reciclar/carga equilibrada etc ... Si la persistencia está en la memoria o incluso en el disco en la nube, entonces será frágil.

Fuera de otras opciones de terceros, podría considerar la persistencia de los datos de programación y ejecución en el almacenamiento externo (servicios de tabla, sql azul, etc.). En un temporizador periódico, la función de trabajador puede consultar los trabajos que se deben realizar, registrar el inicio y luego ejecutar el trabajo. Eso también le permite ampliar potencialmente la cantidad de roles de trabajador ya que su persistencia es externa.

Esto puede complicarse con prisa, pero si lo hace simple con la frecuencia y la grabación de los tiempos de ejecución, puede ser bastante directo.

+0

Digamos por el momento que persisto los datos de ejecución en una base de datos SQL Azure. Podría crear una verificación simple en DoSomethingElse() que hace ping a la base de datos para determinar cuándo se ejecutó por última vez. Esto significaría hacer ping en la base de datos para realizar esa comprobación cada 3 segundos. ¿Es una mala idea? Son muchos viajes innecesarios a la base de datos. Pero, de nuevo, es poco probable que el servidor de la base de datos se vea forzado por tales transacciones triviales. ¿Pensamientos? – hughesdan

1

Steve Marx escribió un par de entradas de blog en how to build a task scheduler en Windows Azure using blob leases, creo que le resultará muy útil.

+0

Explica cómo distribuir las tareas que se programarán. Pero no dice nada acerca de cómo se desencadena la lógica inicial, es decir, cómo sabe un rol de trabajador "ahora" es el momento de despertar y verificar si hay alguna tarea programada en la tabla. Buen artículo de otra manera – DeepSpace101

+0

como ha señalado, un rol de trabajador es esencialmente un programa en un ciclo infinito. en ella, codificaría el cheque como lo desee, presumiblemente en un intervalo determinado que le servirá, cada segundo, minuto, hora, lo que sea y en cada ejecución contrastará con una base de datos de programación si algo necesita hacerlo. es probable que desee actualizar esa base de datos con el último tiempo de ejecución y posiblemente el resultado. –

Cuestiones relacionadas