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));
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:De manera similar, puedes modificar el método
BackgroundJob.Enqueue
para usar el bloqueo distribuido de la siguiente manera:En ambos casos, el método
UseDistributedLock
adquirirá un bloqueo distribuido con un tiempo de espera de30
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.