C# 如何在所有Azure可用实例上分派Hangfire作业?

C# 如何在所有Azure可用实例上分派Hangfire作业?,c#,azure,asp.net-web-api,azure-web-app-service,hangfire,C#,Azure,Asp.net Web Api,Azure Web App Service,Hangfire,我有一个在Azure上运行的Web Api应用程序。我每天早上2:00运行一个调度程序作业,它创建了很多hangfire作业 此时,Web Api应用程序只有一个可用实例,该实例被配置为根据CPU指标向外扩展。这些正在运行的hangfire作业将CPU百分比提高到极限,并创建api应用程序的新可用实例 不幸的是,在我看来,一个给定的hangfire作业在创建它的实例上运行。如何配置Hangfire在所有可用实例上分派作业 不幸的是,在我看来,一个给定的hangfire作业在创建它的实例上运行。如

我有一个在Azure上运行的Web Api应用程序。我每天早上2:00运行一个调度程序作业,它创建了很多hangfire作业

此时,Web Api应用程序只有一个可用实例,该实例被配置为根据CPU指标向外扩展。这些正在运行的hangfire作业将CPU百分比提高到极限,并创建api应用程序的新可用实例

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

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

好的,默认情况下,作业将位于
默认队列中。如果运行多个服务器实例,作业将分发到可用实例。对于测试,我只需添加我的任务,如下所示:

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();
}
然后,在控制台应用程序中处理作业,如下所示:

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();
}
我启动了两个服务器实例,结果如下:


此外,对于配置作业队列,您可以遵循以下步骤。另外,这里有一个问题与您关于仅在一个服务器实例上运行作业的问题相反。

我猜这一行为可能与在同一实例上排队和处理作业时增加零延迟作业处理有关

通过查看代码,每当我们向队列添加新作业时,我们都会看到
WaitAny
事件
Set
。然后,我们再次尝试从队列中获取作业。这会减少作业延迟,因为它会更快地被拾取


我的假设是,只要当前实例忙,就会有多个作业分发到其他实例。

我已经注意到作业分发使用了Azure上的Web API和VM。当只使用配置为自动缩放的Web API时,我没有看到任何调度,但我会重试。在云上运行应用程序时,请考虑Azure函数,而不考虑挂起的作业。这应该是一个更好的方法:。示例:Azure自动为您扩展,如果您使用消费计划,您将只为代码运行的时间付费,。。。。