【问题标题】:Can single delayed job worker start the next job before the ongoing job ends?单个延迟工作的工作人员可以在正在进行的工作结束之前开始下一个工作吗?
【发布时间】:2017-10-23 16:46:16
【问题描述】:

我在我的应用程序中实现了 API 速率限制以调用 3rd 方 API 服务,这限制了在指定时间间隔内向服务发出的请求数。

我查看了延迟的工作文档,但找不到我正在寻找的信息。

我的情况是;

如果有很短的时间,比如说 5 秒,在 2 个延迟的作业之间,工人会做什么?

第二个作业执行时间到了,它会等待第一个作业完成,还是会在指定时间开始作业?

如果是后者,它将打破我的速率限制实现,因为 API 只允许我每分钟 60 个请求,并且两个作业只会将自己限制为每分钟 60 个请求,并且两个作业总共将尝试发送大约 120 个请求一分钟。

提前致谢,干杯!

【问题讨论】:

    标签: ruby-on-rails ruby delayed-job


    【解决方案1】:

    这取决于可用的 DelayedJob 工作人员的数量。因为免费工作人员会在run_at 的时间一到就挑选一份工作并处理它。

    如果您需要确保一次只运行一个作业,我看到两个简单的选项:

    1. 将您的工作人员人数限制为1。或者
    2. 将下一个作业排入队列作为处理的最后一步。

    可能看起来像这样:

    class Job
      def process
        # code for the job ... 
    
        # enqueue the next job to run in 5 seconds
        Job.delay(run_at: 5.seconds.from_now).process
      end
    end
    

    第三个选项更复杂一点,使用named queues。当您将此类作业排入一个特殊的命名队列时,您可以使用该特殊队列来计算下一个作业的时间。而不是像这样将工作排入队列:

    Job.delay.process
    

    检查一个作业是否已经存在,像这样:

    queue_name = 'one_at_a_time'
    latest_job = Delayed::Job.where(queue: queue_name).order(:run_at).last
    run_at     = latest_job ? latest_job.run_at + 5.seconds : Time.current
    Job.delay(queue: queue_name, run_at: run_at).process
    

    【讨论】:

    • 感谢您的快速回复!我已经将工人减少到 1,如果我理解正确,这就足够了,对吧?工人将忙于第一份工作,只有在第一份工作完成后才开始从事第二份工作? “将下一个作业排入队列作为处理的最后一步。”你能详细说明一下吗?在我的应用程序中,用户是安排作业的人,因此无法知道他们何时计划作业。
    • 是的,将工作人员减少到 1 将确保一次只运行一个作业。我不知道用户会在您的应用中安排工作。在这种情况下,第二个版本不起作用。但是可能还有另一种选择。将在几分钟内更新我的答案...
    • 非常感谢您的详细解释,我看到您在那里所做的第三个选项,它可以工作,但它需要一些不同的实现。因为最后一份工作并不总是会与我们即将创建的工作相冲突,对吧?用户可以安排下个月的工作,也可以安排第二天。例如,我需要检查他之前和接下来的 10 秒,以查看是否存在任何潜在冲突。但现在我会和我认为的单身工人一起去。
    【解决方案2】:

    另一种选择是每个队列运行一个工作实例:

    RAILS_ENV=production bin/delayed_job --queue=tracking start

    RAILS_ENV=production bin/delayed_job --queues=mailers,tasks start

    Documentation

    【讨论】:

    • 除了在作业完成之后,它只运行另一个?
    • @VishwasNahar 是的。如果每个队列有一名工作人员。还要确保每个 dj 工作人员都指定了一个队列,因为在没有指定队列的情况下启动的工作人员将从 any 队列运行作业。
    • 当然,但在我的情况下,我有 100 个工作延迟的地方,我不能只分配一名工人来完成这项工作
    猜你喜欢
    • 2011-08-29
    • 2012-04-16
    • 2014-09-21
    • 2012-04-10
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多