【问题标题】:How can I create delays between failed Queued Job attempts in Laravel?如何在 Laravel 中失败的排队作业尝试之间创建延迟?
【发布时间】:2016-02-07 19:41:43
【问题描述】:

我在 Laravel 中有一个排队的作业,由于高负载导致外部 API 失败,该作业有时会失败。问题是我的选择似乎是让 Laravel 队列继续用请求敲击 API,直到它成功或告诉它在 X 个请求后停止。

我有什么办法可以根据作业的失败情况告诉它在 5 分钟内再试一次,而不是继续敲门吗?

我想使用内置的队列处理程序,但重试功能似乎不是为了处理现实生活中的失败场景而构建的。我认为很多工作失败的原因并不能通过立即重试来解决。

【问题讨论】:

    标签: laravel laravel-5 laravel-5.1


    【解决方案1】:

    你可以这样做:

    // app/Jobs/ExampleJob.php
    namespace App\Jobs;
    
    class ExampleJob extends Job
    {
        use \Illuminate\Queue\InteractsWithQueue;
    
        public function handle()
        {
            try {
                // Do stuff that might fail
            } catch(AnException $e) {
                // Example where you might want to retry
    
                if ($this->attempts() < 3) {
                    $delayInSeconds = 5 * 60;
                    $this->release($delayInSeconds);
                }
            } catch(AnotherException $e) {
                // Example where you don't want to retry
                $this->delete();
            }
        }
    }
    

    请注意,您不必在例外情况下执行此操作,您也可以只检查您的操作结果并从那里做出决定。

    【讨论】:

    • 谢谢,我误解了释放工作的作用。另外,您在哪里找到 delete() 函数?这似乎没有记录。我希望有一种受支持的方法可以通过将作业放入失败的作业表中来删除作业。
    • 关于将它们添加到失败的作业表中。我不太确定这是如何工作的,但我相信您可能必须(重新)抛出异常,以便它也由队列工作人员处理。
    • @RojVroemen 我认为我们可以通过为attempts &lt; 3 if-statement 添加} else {throw $e;} 来解决failed_jobs 表问题。
    【解决方案2】:

    您可以使用 Illuminate\Queue\InteractsWithQueue 方法手动释放作业

    $this->release(10);
    

    该参数将定义在作业再次可用之前的秒数。

    查看official documentation 中的手动发布作业部分,了解 5.1 版。

    【讨论】:

    • 由于这部​​分已从 5.7 文档中删除,它仍然是有效的解决方案吗?
    • @Casper 那部分确实被删除了,但在laravel.com/docs/5.7/queues#rate-limiting(也是5.8)中仍然提到了持续时间的发布,所以我猜它仍然是一个有效的解决方案
    【解决方案3】:

    Laravel 8

    /**
     * The number of seconds to wait before retrying the job.
     *
     * @var int
     */
    public $backoff = 3;
    

    【讨论】:

      【解决方案4】:

      Laravel 5.8+

      /**
       * The number of seconds to wait before retrying the job.
       *
       * @var int
       */
      public $retryAfter = 3;
      

      【讨论】:

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