2016-12-21 1 views
5

これは、laravel 5.3、beanstalk、ttr、およびQueueおよびQueueWorkersで動作するタイムアウトに関連しています。 TTR:https://github.com/kr/beanstalkd/wiki/faqTTRがなくなったときQueueWorkerはどうなりますか?

キューからのジョブが正しく理解できれば、QueueWorkerがそれを選択するときに状態が予約されます。このジョブ状態は、ttrがなくなるとreadyに戻されます。しかし、QueueWorkerはどうなりますか?

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

TTRは60秒に設定し、デフォルトとして、次のとおりです。

はのはQueueWorkerは、次のコマンドで600に設定されたタイムアウトを持っているとしましょう。

ジョブ中に別のサイトにリクエストが行われ、応答までに120秒かかります。 60秒後、ジョブはTTRのために準備完了状態に戻されます。応答が受信されるまでQueueWorkerは仕事を続けますか?最大600秒ですか?あるいは、TTRに達したときにQueueWorkerが仕事をやめるのでしょうか?

答えて

3

実際、QueueWorkerはジョブが完了するまで実行されます。デーモンフラグなしでキューワーカーを実行すると、ベローコードが実行されます。

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

何acctuallyこのコードではありませんが、それはキューからポップ仕事だとコマンドとそのジョブを発射です。

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:TTRがなくなった場合でも https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Worker.php#L213

、これが達成されたタイムアウトまでの仕事に取り組んでい続けるQueueWorkerを意味しているのより多くの情報 https://github.com/laravel/framework/tree/5.2/src/Illuminate/Queue

+0

のソースを掘りますか? – MmynameStackflow

+0

正しい。 TTRの仕組みの詳細についてはhttps://github.com/kr/beanstalkd/wiki/faq#how-does-ttr-work –

+0

タイムアウトを60秒以上に設定するのはどうですか?今、2番目のQueueWorkerはTTRがなくなり、ジョブを削除しようとしたときに最初のQueueWorkerがジョブを見つけられなくなるため問題を引き起こす準備完了状態になるため、ジョブを選択します。 TTRより高いタイムアウトを使用する場合、タイムアウトに達するまでTTRが時間切れになるのを防ぐために、しばらくの間、ジョブを「タッチ」する必要があります。私は正しいですか? – MmynameStackflow

関連する問題