我在Azure上运行了一个Web Api应用程序。我每天早上凌晨2点运行调度程序工作,这会产生大量的篝火作业。
目前,Web Api应用程序只有一个可用的实例,可根据CPU指标进行扩展。这些正在运行的hangfire作业将CPU百分比增加到限制并创建api app的新可用实例。
不幸的是,在我看来,一个给定的hangfire作业在创建它的实例上运行。如何配置Hangfire以在所有可用实例上调度作业?
答案 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();
}
我启动了两个服务器实例,得到了以下结果:
答案 1 :(得分:0)
我猜这种行为可能与this pull request相关联,这会在作业排队并在同一个实例上处理时添加零延迟作业处理。
查看代码,每当我们将新作业添加到队列时,我都会看到WaitAny
的事件为Set
。然后我们再次尝试从队列中获取作业。这可以减少作业延迟,因为它会很快被提起。
我的假设是,当前实例忙时,多个作业将分发到您的其他实例。