当 TTR 运行 结束时 QueueWorker 会发生什么?
What happens with the QueueWorker when TTR ran out?
这涉及 laravel 5.3、beanstalk、ttr 和与 Queue 和 QueueWorkers 一起工作的超时。 TTR:https://github.com/kr/beanstalkd/wiki/faq
如果我理解正确的话,当 QueueWorker 挑选作业时,队列中的作业会保留状态。当 ttr 用完时,此作业状态将更改回就绪。但是 QueueWorker 会发生什么?
假设 QueueWorker 通过以下命令将超时设置为 600:
php artisan queue:work --tries=1 --timeout=600 --sleep=0
ttr 默认设置为 60 秒。
在作业期间向另一个站点发出请求,需要 120 秒才能响应。 60 秒后作业被设置回就绪状态,因为 TTR。 QueueWorker 是否会继续工作直到收到响应(最多 600 秒)?或者当达到 TTR 时,QueueWorker 是否会停止工作?
实际上,QueueWorker 会 运行 直到作业完成。当你 运行 queue worker 没有守护进程标志时,它将 运行 下面的代码:
return $this->worker->pop(
$connection, $queue, $delay,
$this->option('sleep'), $this->option('tries')
);
参考:
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Console/WorkCommand.php#L123
此代码的作用是从队列中弹出作业并将该作业作为命令触发:
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;
}
}
参考:
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Worker.php#L213
在源代码中挖掘更多信息:
https://github.com/laravel/framework/tree/5.2/src/Illuminate/Queue
这涉及 laravel 5.3、beanstalk、ttr 和与 Queue 和 QueueWorkers 一起工作的超时。 TTR:https://github.com/kr/beanstalkd/wiki/faq
如果我理解正确的话,当 QueueWorker 挑选作业时,队列中的作业会保留状态。当 ttr 用完时,此作业状态将更改回就绪。但是 QueueWorker 会发生什么?
假设 QueueWorker 通过以下命令将超时设置为 600:
php artisan queue:work --tries=1 --timeout=600 --sleep=0
ttr 默认设置为 60 秒。
在作业期间向另一个站点发出请求,需要 120 秒才能响应。 60 秒后作业被设置回就绪状态,因为 TTR。 QueueWorker 是否会继续工作直到收到响应(最多 600 秒)?或者当达到 TTR 时,QueueWorker 是否会停止工作?
实际上,QueueWorker 会 运行 直到作业完成。当你 运行 queue worker 没有守护进程标志时,它将 运行 下面的代码:
return $this->worker->pop(
$connection, $queue, $delay,
$this->option('sleep'), $this->option('tries')
);
参考: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Console/WorkCommand.php#L123
此代码的作用是从队列中弹出作业并将该作业作为命令触发:
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;
}
}
参考: https://github.com/laravel/framework/blob/5.2/src/Illuminate/Queue/Worker.php#L213
在源代码中挖掘更多信息: https://github.com/laravel/framework/tree/5.2/src/Illuminate/Queue