Laravel Постоянная генерация очереди `светится: очередь: перезапуск` - PullRequest
1 голос
/ 07 августа 2020

Ive Laravel очередь запущена, но при подключении к базе данных, вот конфигурация:

'database' => [
    'driver' => 'database',
    'connection' => 'mysql',
    'table' => 'jobs',
    'queue' => 'default',
    'retry_after' => 190,
    'block_for' => 0,
]

Вот как я ее запускаю:

php artisan queue:work --queue=xyz_queue > storage/logs/queue.log

В интерфейсе командной строки redis это что происходит каждую секунду:

введите описание изображения здесь

1 Ответ

1 голос
/ 07 августа 2020

Это нормальное и ожидаемое поведение. Согласно документации

Поскольку обработчики очередей являются долгоживущими процессами, они не будут принимать изменения в вашем коде без перезапуска. Итак, самый простой способ развернуть приложение с использованием обработчиков очереди - это перезапустить работников во время процесса развертывания. Вы можете корректно перезапустить всех воркеров, введя команду queue: restart: php artisan queue:restart

Эта команда проинструктирует всех работников очереди корректно «d ie» после того, как они закончат sh обрабатывает свое текущее задание, чтобы существующие задания не были потеряны.

  • Что делает queue:restart, так это установка текущей метки времени на значение illuminate:queue:restart key.
  • Когда очереди будут израсходованы процессами (php artisan queue:work), он получит это значение временной метки из ключа illuminate:queue:restart, а после того, как задание будет завершено , оно получит значение снова из того же ключа.
  • Он сравнивает, является ли значение до обработки задания таким же, как после обработки задания.
  • Если оно другое, то оно будет остановить долгоживущий процесс.

Это эффективный способ (поскольку Redis очень быстр для такого рода сценариев ios), чтобы определить, был ли изменен код и должен ли вакансии должны быть обновлены для этого кода c hange.

Причина, по которой он сохраняет значение в Redis, «скорее всего» ваш драйвер кеша - Redis. Если вы измените его на file, вместо этого он будет сохранен в файле и будет делать запрос на получение в этот файл.

Вот методы, связанные с ;

protected function stopIfNecessary(WorkerOptions $options, $lastRestart, $job = null)
{
    if ($this->shouldQuit) {
        $this->stop();
    } elseif ($this->memoryExceeded($options->memory)) {
        $this->stop(12);
    } elseif ($this->queueShouldRestart($lastRestart)) {
        $this->stop();
    } elseif ($options->stopWhenEmpty && is_null($job)) {
        $this->stop();
    }
}

protected function queueShouldRestart($lastRestart)
{
    return $this->getTimestampOfLastQueueRestart() != $lastRestart;
}

protected function getTimestampOfLastQueueRestart()
{
    if ($this->cache) {
        return $this->cache->get('illuminate:queue:restart');
    }
}
...