Работа всегда терпит неудачу на рабочих местах Laravel - PullRequest
0 голосов
/ 26 октября 2018

Это продолжение Laravel - Выполнение заданий в последовательности

Я решил пойти с лимитом скорости повторного выполнения.Код ниже

jobClass {

  protected $subscription;

  public function __construct(Subscription$subscription) {
        $this->subscription= $subscription;
    }
  public function handle() {
    Redis::funnel('mailingJob')->limit(1)->then(function () {
            // Job logic...
            (new Mailer($this->subscription))->send();

        }, function () {
            // Could not obtain lock...
            return $this->release(10);
        });
  }
}

И код контроллера выглядит следующим образом.

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Subscriptions;
class MailController extends Controller
{


    public function sendEmail() {
        Subscriptions::all()
        ->each(function($subscription) {
            SendMailJob::dispatch($subscription);
        });
    }
}

Теперь, когда я запускаю очередь, некоторые из них работают, остальные (около 90%) не работают с приведенным нижеошибка в горизонте.

SendMailJob предпринималась слишком много раз или слишком долго.Задание может быть ранее истекло.

Что мне не хватает?Пожалуйста, кто-нибудь направит меня в правильном направлении.

Моя цель - одновременно запускать только одно задание типа.

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

В документации Laravel есть подсказка об этом:

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

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

Итак, я представляю, что там, где вы работаете с работником очереди, вы не устанавливаете флаг --tries достаточно высоко.

Хотя вы можете просто установить очень высокий --tries, он не очень масштабируемый.

Наилучшим решением, как предлагается в документации, было бы увеличение числа попыток, а также использование попыток, основанных на времени

Вы также можете увеличить return $this->release(10); время выпуска здесь. Это должно заставить задание подождать дольше, прежде чем пытаться снова получить блокировку, поэтому будет использовать меньше попыток!

0 голосов
/ 26 октября 2018

[...] has been attempted too many times or run too long - ошибка, которая не говорит вам, почему задание не удалось.Это означает, что какое-то другое исключение вызывало сбой вашей работы при каждой попытке работника, и работник пробовал это максимальное количество раз, разрешенное вашей конфигурацией.Чтобы понять причину сбоя, проверьте в файле laravel.log исключение, которое привело к сбою задания.

В вашем случае, поскольку Mailer связывается с внешней системой, возможно, системасоединение с вами ограничивает скорость, или у них могут быть временные проблемы с соединением или другие простои сервиса.Опять же, в ваших лог-файлах должно быть больше деталей.

...