【问题标题】:How to dispatch Hangfire jobs on all Azure available instances?如何在所有 Azure 可用实例上分派 Hangfire 作业?
【发布时间】:2018-05-15 16:11:43
【问题描述】:

我有一个在 Azure 上运行的 Web Api 应用程序。我每天早上 2:00 运行一个调度程序作业,它会创建大量挂起作业。

目前,Web Api 应用只有一个配置为基于 CPU 指标横向扩展的可用实例。这些正在运行的 hangfire 作业将 CPU 百分比增加到极限并创建新的可用 api 应用实例。

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

【问题讨论】:

  • 在云上运行应用程序时,请考虑使用 Azure Functions 而不是 Hangfire 作业。这应该是一个更好的方法:docs.microsoft.com/en-us/azure/azure-functions/…。示例:Azure 自动为您扩展,如果您使用消费计划,您只需为代码运行的时间付费,....

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


【解决方案1】:

不幸的是,在我看来,给定的 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();
}

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

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

【讨论】:

  • 我已经注意到在 Azure 上使用 Web API 和 VM 的作业分布。仅使用配置为自动缩放的 Web API 时,我没有看到任何调度,但我会重试。
【解决方案2】:

我猜这种行为可能与this pull request 有关,它在作业在同一实例上排队和处理时添加了零延迟作业处理。

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

我的假设是,只要当前实例很忙,就会有多个作业分配给您的另一个实例。

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2017-03-09
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多