【问题标题】:How to add 2 minutes delay between jobs in a queue?如何在队列中的作业之间添加 2 分钟的延迟?
【发布时间】:2022-12-13 08:38:35
【问题描述】:

我在 ASP.NET Core 中使用 Hangfire,服务器有 20 个工作人员,这意味着可以同时排队 20 个作业。

我需要的是将它们一个接一个地排队,每个队列之间有 2 分钟的延迟。每个作业可能需要 1-45 分钟,但同时运行作业没有问题,但同时启动 20 个作业时确实有问题。这就是为什么将工人数更改为 1 对我来说不切实际(这会大大减慢进程)。

我的想法是我只是不希望 2 个作业同时运行,因为这可能会在我的逻辑中产生一些冲突,但是如果第二个作业在第一个作业之后 2 分钟开始,那么我很好。

我怎样才能做到这一点?

【问题讨论】:

  • 您如何向 hangfire 添加作业?您使用的是BackgroundJob.Enqueue() 方法吗?

标签: asp.net-core hangfire


【解决方案1】:

您可以使用 BackgroundJob.Schedule() 在特定时间运行您的作业:

BackgroundJob.Schedule(() => Console.WriteLine("Hello"), dateTimeToExecute);

在此基础上,为第一个作业设置一个执行日期,然后为每个新作业将此日期增加到 2 分钟。

是这样的:

var dateStartDate = DateTime.Now;
foreach (var j in listOfjobsToExecute)
{
    BackgroundJob.Schedule(() => j.Run(), dateStartDate);
    dateStartDate = dateStartDate.AddMinutes(2);
}

在这里查看更多: https://docs.hangfire.io/en/latest/background-methods/calling-methods-with-delay.html?highlight=delay

【讨论】:

    【解决方案2】:

    实现这一目标的一种方法是使用 Hangfire 的批处理功能。使用此功能,您可以将作业分组并设置每个批次中可以同时处理的最大作业数。这样,您可以确保只有一定数量的作业同时启动,同时仍允许并发处理单个作业。 这里 :

    var batch = new BatchOptions
    {
        BatchSize = 20,
        MaxConcurrencyLevel = 1
    };
    

    接下来,使用 EnqueueInBatch 方法将您的作业排入队列,指定您在上一步中创建的批次。此方法还采用延迟参数,您可以使用该参数指定每个作业之间的延迟。例如:

    // Enqueue the first job with no delay
    BackgroundJob.EnqueueInBatch(() => ProcessJob(), batch);
    
    // Enqueue the remaining jobs with a two-minute delay
    for (int i = 1; i < 20; i++)
    {
        BackgroundJob.EnqueueInBatch(() => ProcessJob(), batch, TimeSpan.FromMinutes(2));
    }
    

    这会将您的作业排入指定的批次,每个作业之间有两分钟的延迟。批处理的最大并发级别将确保一次只启动一个作业,同时仍允许并发处理单个作业。

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 2022-08-13
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 2017-12-02
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多