仅根据环境在服务器上拾取 Hangfire 任务(交换插槽)

Only pickup Hangfire task on server based on the environment (swap slot)

我们运行正在为使用 Azure 应用服务的网站使用 Hangfire。我们也用了精彩的swapping mechanism。这意味着我们不是部署到生产环境,而是部署一个插槽并在部署完成后交换它。

问题是,交换槽一直在从 hangfire 中获取作业。

我想确保只有生产槽在实际执行 hangfire 作业。挑战在于,无论是生产状态还是非生产状态,都无需重新启动应用程序(双向)。

我可以在 Azure 中设置插槽粘性应用程序设置,这样我就可以确定我是否处于生产模式。它只给我留下了关键问题:

如何启用和禁用我的应用程序在 运行 时间处理作业?

尝试配置触发式 WebJob,它会在每次调用 API 或达到计划时运行作业。此外,还有 2 个配置设置可以停止 WebJob,

WEBJOBS_STOPPED - 将此设置设置为 1 以禁用 运行 任何作业(还将停止所有当前 运行 作业)。

WEBJOBS_DISABLE_SCHEDULE - 将此项设置为 1 以关闭所有计划的触发。与 WEBJOBS_STOPPED 不同,WebJobs 仍然可以手动调用。

更多详细信息,请参阅本文:https://github.com/projectkudu/kudu/wiki/WebJobs

我们通过使用不同的部署策略将 Hangfire 服务分离到它自己的应用服务来解决这个问题。 对于 Hangfire 服务,我们硬停止服务,部署然后再次启动服务。