Как создать задержки между неудачными попытками задания в очереди в Laravel?

У меня есть работа в очереди в Laravel, которая время от времени терпит неудачу из-за сбоя внешнего API из-за высокой нагрузки. Проблема в том, что мой выбор, по-видимому, состоит в том, чтобы очередь Laravel продолжала забивать API запросами до тех пор, пока он не преуспеет или не скажет ему остановиться после X количества запросов.

есть ли способ для меня, основываясь на том, как работа терпит неудачу, сказать ему попробовать еще раз через 5 минут вместо того, чтобы продолжать забивать?

Я хочу использовать встроенную очередь обработчик, но функция повтора не создается для обработки реальных сценариев сбоя. Я бы подумал,что многие причины провала работы не будут решены путем немедленной попытки снова.

2 ответов


что вы можете сделать, это что-то вроде этого:

// 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();
        }
    }
}

обратите внимание, что вам не нужно делать это с исключениями, вы также можете просто проверить результат своих действий и решить оттуда.


вы можете вручную освободить задание, используя метод Illuminate\Queue\InteractsWithQueue

$this->release(10);

аргумент будет определять количество секунд, пока задание не будет доступно снова.

проверьте раздел Ручное Освобождение Заданий на официальная документация для версии 5.1.