如何暂停或延迟Horizo​​n队列上的所有作业

时间:2018-08-29 09:34:29

标签: laravel laravel-5.6

在Horizo​​n和Queue方面我还很陌生,遇到了这个问题。

我将Horizo​​n + Redis用于队列。队列中的作业需要连接到远程服务并获取一些数据。该服务有一些连接限制(例如,每分钟5个请求,每小时/天X个请求)。有时它也可能不可用或需要维护。

现在,我可以在队列中处理很多这些工作(例如10k甚至更多)。在给定的分钟内(或实际限制是多少)发出第5次请求后,所有剩余的匹配都将返回false,而我只需要延迟它们即可。

然后,在第一个作业被延迟之后,该第二个之后的所有作业也将尝试连接到远程服务,也将失败并被延迟。这实际上会延迟号码作业,直到服务可以再次接受连接为止。

这会带来两个问题:

  1. 这会延迟很多工作,在重试5或10次后最终将失败,从而导致大量失败的工作。
  2. 这将使许多已经不必要的服务不必要地连接到我。有些服务不喜欢那样,会延迟更多的事情……

最好以某种方式暂停给定队列中的所有作业,或者以某种方式每分钟仅处理5个作业。最糟糕的解决方案可能只是sleep()持续25秒,但如果有多个工作人员,则事件帽子将无法工作。

我尝试使用redis节流:

Redis::throttle('key')->allow(10)->every(60)->then(function () {
    // Job logic...
}, function () {
    // Could not obtain lock...

    return $this->release(10);
});

但是我做错了什么(密钥设置)或其他什么,但是在几分钟之内完成了前10个工作之后,其他工作就被release(10)延迟了,而我遇到了如上所述的同样问题。

我确定有人遇到这样的问题,我很好奇解决这个问题的正确方法。

谢谢您的帮助!

0 个答案:

没有答案