es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Disparando un trabajo programado desde varios servidores de Hangfire.

Estamos iniciando un trabajo programado en un intervalo configurado y está siendo activado. Esto funciona en un entorno de servidor hangfire único.
En algunos de nuestros entornos, tendremos más de un servidor. Por lo tanto, en este escenario, todos los servidores activarán ese trabajo en ese intervalo particular. ¿Podemos restringir este trabajo para que solo se active desde un servidor?
csharp
string cronExpressionCleanupJob = "0 0 0/{2} ? * *";
RecurringJob.AddOrUpdate<cleanupjobtriggerjob>(nameof(CleanUpJobTriggerJob),
job => job.ExecuteJob(null, null), cronExpressionCleanupJob, TimeZoneInfo.Local);
var hangFireJobId = BackgroundJob.Enqueue<cleanupjobtriggerjob>(x => x.ExecuteJob(null, null));

Tags:  

Answer

  1. Avatar for davy.ai

    Sí, es posible restringir que el trabajo se active solo desde un servidor en un entorno de múltiples servidores utilizando Hangfire.

    Una forma de lograr esto es utilizando el método UseDistributedLock de Hangfire para adquirir un bloqueo distribuido antes de ejecutar el trabajo. Esto asegurará que solo un servidor pueda adquirir el bloqueo y ejecutar el trabajo a la vez, mientras que los demás servidores esperarán a que se libere el bloqueo.

    Por ejemplo, puedes modificar el método RecurringJob.AddOrUpdate de la siguiente manera para usar el bloqueo distribuido:

    RecurringJob.AddOrUpdate<cleanupjobtriggerjob>(nameof(CleanUpJobTriggerJob),
        job => job.ExecuteJob(null, null), cronExpressionCleanupJob, TimeZoneInfo.Local)
        .UseDistributedLock(30 * 60); // tiempo de espera del bloqueo de 30 minutos
    

    De manera similar, puedes modificar el método BackgroundJob.Enqueue para usar el bloqueo distribuido de la siguiente manera:

    var hangFireJobId = BackgroundJob.Enqueue<cleanupjobtriggerjob>(x => x.ExecuteJob(null, null))
        .UseDistributedLock(30 * 60); // tiempo de espera del bloqueo de 30 minutos
    

    En ambos casos, el método UseDistributedLock adquirirá un bloqueo distribuido con un tiempo de espera de 30 minutos antes de ejecutar el trabajo. Esto asegurará que solo un servidor pueda ejecutar el trabajo a la vez, mientras que los demás servidores esperarán a que se libere el bloqueo. Una vez que se haya ejecutado el trabajo, el bloqueo se liberará automáticamente.

Comments are closed.