如何在所有Azure可用实例上调度Hangfire作业?

时间:2017-12-01 14:19:18

标签: c# azure asp.net-web-api azure-web-sites hangfire

我在Azure上运行了一个Web Api应用程序。我每天早上凌晨2点运行调度程序工作,这会产生大量的篝火作业。

目前,Web Api应用程序只有一个可用的实例,可根据CPU指标进行扩展。这些正在运行的hangfire作业将CPU百分比增加到限制并创建api app的新可用实例。

不幸的是,在我看来,一个给定的hangfire作业在创建它的实例上运行。如何配置Hangfire以在所有可用实例上调度作业?

2 个答案:

答案 0 :(得分:3)

  

不幸的是,在我看来,一个给定的hangfire作业在创建它的实例上运行。如何配置Hangfire以在所有可用实例上调度作业?

AFAIK,默认情况下作业将在default队列中。如果您运行多个服务器实例,则该作业将分发到可用实例。为了测试,我只是添加我的任务如下:

Enumerable.Range(11, 30).ForEach(i =>
{
    BackgroundJob.Enqueue(() => Console.WriteLine($"[Task-{i}] Getting Started with HangFire!"));
});

然后,按如下方式处理控制台应用程序中的作业:

using (var server = new BackgroundJobServer())
{
    Console.WriteLine("Hangfire Server started. Press any key to exit...");
    Console.ReadKey();
}

我启动了两个服务器实例,得到了以下结果:

enter image description here

此外,要配置作业队列,您可以关注here。此外,这里是issue,与您在一个服务器实例上仅运行作业的问题相反。

答案 1 :(得分:0)

我猜这种行为可能与this pull request相关联,这会在作业排队并在同一个实例上处理时添加零延迟作业处理。

查看代码,每当我们将新作业添加到队列时,我都会看到WaitAny的事件为Set。然后我们再次尝试从队列中获取作业。这可以减少作业延迟,因为它会很快被提起。

我的假设是,当前实例忙时,多个作业将分发到您的其他实例。