2016-12-21 18 views
5

Dotyczy to wersji 5.3, beanstalk, ttr i timeout współpracujących z Queue i QueueWorkers. TTR: https://github.com/kr/beanstalkd/wiki/faqCo stanie się z QueueWorker po wyczerpaniu TTR?

Jeśli dobrze rozumiem, zadanie z kolejki pobiera stan zarezerwowany, gdy wybiera go QueueWorker. Ten stan zadania zostanie zmieniony z powrotem na gotowy, gdy skończy się ttr. Ale co się dzieje z QueueWorker?

Powiedzmy, że QueueWorker ma czasu ustawionego na 600 za pomocą następującego polecenia:

php artisan queue:work --tries=1 --timeout=600 --sleep=0 

TTR jest jako domyślny, ustawiony na 60 sekund.

Podczas zadania, żądanie jest przesyłane do innej witryny i trwa do 120 sekund. Po 60 sekundach zadanie powraca do stanu gotowości, ponieważ TTR. Czy aplikacja QueueWorker będzie kontynuować pracę, dopóki nie otrzyma odpowiedzi, maksymalnie 600 sekund? A może kolejka przestanie działać po osiągnięciu TTR?

Odpowiedz

3

W rzeczywistości QueueWorker będzie działać do momentu zakończenia zadania. Gdy uruchomisz moduł kolejki, bez flagi demona, uruchomi się poniższy kod.

return $this->worker->pop(
     $connection, $queue, $delay, 
     $this->option('sleep'), $this->option('tries') 
    ); 

Referance: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Console/WorkCommand.php#L123

Co acctually w tym kodzie nie jest to pop zadanie z kolejki i ogień to zadanie jako polecenia.

public function process($connection, Job $job, $maxTries = 0, $delay = 0) 
{ 
    if ($maxTries > 0 && $job->attempts() > $maxTries) { 
     return $this->logFailedJob($connection, $job); 
    } 

    try { 
     $job->fire(); 

     $this->raiseAfterJobEvent($connection, $job); 

     return ['job' => $job, 'failed' => false]; 
    } catch (Exception $e) { 

     if (! $job->isDeleted()) { 
      $job->release($delay); 
     } 

     throw $e; 
    } catch (Throwable $e) { 
     if (! $job->isDeleted()) { 
      $job->release($delay); 
     } 

     throw $e; 
    } 
} 

Referance: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Worker.php#L213

Kopanie źródło uzyskać więcej informacji https://github.com/laravel/framework/tree/5.2/src/Illuminate/Queue

+0

Czy to oznacza QueueWorker będzie pracował w pracy aż do czasu oczekiwania został osiągnięty, nawet gdy TTR zabrakło? – MmynameStackflow

+0

Prawidłowo. Aby uzyskać więcej informacji o tym, jak działa TTR, https://github.com/kr/beanstalkd/wiki/faq#how-does-ttr-work –

+0

Jaki jest sens ustawiania limitu czasu wyższego niż 60 sekund? Teraz drugi QueueWorker wybierze zadanie, ponieważ po wyczerpaniu TTR zadanie będzie miało stan gotowości, który powoduje problemy, ponieważ pierwszy QueueWorker nie może znaleźć pracy, gdy próbuje ją usunąć. Kiedy używasz limitu czasu wyższego niż TTR, musisz od czasu do czasu "dotknąć" pracy, aby TTR zabrakło czasu do czasu osiągnięcia limitu czasu. Mam rację? – MmynameStackflow

Powiązane problemy