在Horizon和Queue方面我还很陌生,遇到了这个问题。
我将Horizon + Redis用于队列。队列中的作业需要连接到远程服务并获取一些数据。该服务有一些连接限制(例如,每分钟5个请求,每小时/天X个请求)。有时它也可能不可用或需要维护。
现在,我可以在队列中处理很多这些工作(例如10k甚至更多)。在给定的分钟内(或实际限制是多少)发出第5次请求后,所有剩余的匹配都将返回false,而我只需要延迟它们即可。
然后,在第一个作业被延迟之后,该第二个之后的所有作业也将尝试连接到远程服务,也将失败并被延迟。这实际上会延迟号码作业,直到服务可以再次接受连接为止。
这会带来两个问题:
最好以某种方式暂停给定队列中的所有作业,或者以某种方式每分钟仅处理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)延迟了,而我遇到了如上所述的同样问题。
我确定有人遇到这样的问题,我很好奇解决这个问题的正确方法。
谢谢您的帮助!