代码之家  ›  专栏  ›  技术社区  ›  Petay87

尝试使用throttle时,Redis上的Laravel作业失败

  •  1
  • Petay87  · 技术社区  · 8 年前

    最终目标

    我的目的是让我的应用程序向Redis队列发送大量潜在的电子邮件(该位正在工作),然后Redis将这些电子邮件的处理限制为每选定的分钟数只能处理一组电子邮件。

    到目前为止的故事。。。。

    到目前为止,我已经成功地将测试数量的50个作业推送到Redis队列。我可以登录到Horizon并在“processjob”队列中看到这50个作业。我还可以登录到redis cli,在list键下看到50个集合”queues:processjob".

    我的问题是,只要我尝试打开节流阀,只有1个作业运行,其余作业将失败,并出现以下错误:

    如果我取消油门,所有的工作文件和5个工作立即运行。

    我想可能是键名不正确,但如果我更改以下内容:

        public function handle()
    {
        //
        Redis::throttle('queues:processjob')->allow(1)->every(60)->then(function(){
    
          Storage::disk('local')->append('testFile.txt',date("Y-m-d H:i:s"));
        }, function (){
          return $this->release(10);
        });
    }
    

    对此:

        public function handle()
    {
        //
        Redis::funnel('queues:processjob')->limit(1)->then(function(){
    
          Storage::disk('local')->append('testFile.txt',date("Y-m-d H:i:s"));
        }, function (){
          return $this->release(10);
        });
    }
    

    我的想法。。。

    1 回复  |  直到 8 年前
        1
  •  5
  •   Petay87    8 年前

    故障

    我以为 Redis::throttle('queues:processjob')

    修复

    是指它自己的“holding”队列,因此必须是唯一的Redis密钥名。因此,将其更改为 Redis::throttle('throttle:queues:processjob') 对我来说很好。

    工作原理

    当我第一次看这个的时候,我以为 Redis::throttle('this') 已限制指定的队列。在某种程度上,这是正确的,但如果作业是通过其他方式创建的,则它将不起作用。

    实际上创建了一个新的“等待”队列,在该队列中作业将一直执行,直到满足指定的条件为止。因此,在本例中,作业将进入队列“this”,当释放throttle触发器时,它们将被传递到执行代码中指定的队列。在这种情况下queues:processjob'.

    我希望这有帮助!